- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题描述。
这是当前 immutables site 中示例的简化版本.
所以我有一个项目要与 MongoDB 一起使用。
@Value.Immutable
@Mongo.Repository("items")
public abstract class Item {
@Mongo.Id
public abstract long id();
public abstract String name();
}
为简单起见,我创建了一个 Junit 测试。就像例子一样。问题是这个 junit 测试,虽然它在 immutables site 的示例中出现了抛出异常:
public class ItemTest{
@Test
public void testRepository() {
try {
//Simple ItemRepository creation
ItemRepository items = new ItemRepository(
RepositorySetup.forUri("mongodb://localhost/test")
);
// Create item Item item = ImmutableItem.builder()
.id(1)
.name("one")
.build();
//Insert is async. Returns a Future.
FluentFuture<Integer> future=items.insert(item);
future.get(); // get the result (ensure it was saved)
}catch(Exception e){
e.printStackTrace();
Assert.fail(e.getMessage());
}
}//end test
}//end class
运行此测试将导致以下异常:
org.bson.codecs.configuration.CodecConfigurationException: Can't finda codec for interface spyros.stackoverflow.example.Item
下面提供了完整的堆栈跟踪。
java.lang.AssertionError: java.util.concurrent.ExecutionException: **org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for interface spyros.stackoverflow.example.Item.**
at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:552)
at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:533)
at com.google.common.util.concurrent.FluentFuture$TrustedFuture.get(FluentFuture.java:82)
at com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:62)
at spyros.stackoverflow.example.ItemTest.testRepository(ItemTest.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for interface spyros.stackoverflow.example.Item.
at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46)
at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63)
at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:37)
at com.mongodb.MongoCollectionImpl.getCodec(MongoCollectionImpl.java:591)
at com.mongodb.MongoCollectionImpl.insertMany(MongoCollectionImpl.java:333)
at com.mongodb.MongoCollectionImpl.insertMany(MongoCollectionImpl.java:322)
at org.immutables.mongo.repository.Repositories$Repository$2.call(Repositories.java:130)
at org.immutables.mongo.repository.Repositories$Repository$2.call(Repositories.java:127)
at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)
at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:69)
at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
at org.junit.Assert.fail(Assert.java:88)
at spyros.stackoverflow.example.ItemTest.testRepository(ItemTest.java:84)
我使用 gradle,build.gradle
如下。
plugins {
id 'java'
id 'java-library'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenLocal()
mavenCentral()
jcenter()
}
dependencies {
implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.7'
implementation 'org.apache.logging.log4j:log4j-core:2.7'
implementation 'javax.persistence:javax.persistence-api:2.2'
implementation 'javax.xml.bind:jaxb-api:2.1'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
implementation 'com.google.guava:guava:27.1-jre'
annotationProcessor 'org.immutables:value:2.7.4'
implementation 'org.immutables:value:2.7.4'
implementation 'org.immutables:mongo:2.7.4'
implementation 'org.apache.commons:commons-lang3:3.4'
implementation 'org.apache.commons:commons-collections4:4.1'
implementation 'org.apache.commons:commons-configuration2:2.3'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
确定的原因
Immutables JSON 库需要能够找到实现 com.google.gson.TypeAdapterFactory
的自动生成的 GsonAdaptersItem.class
。事实上,对于每个名为 XXX
的 interface
或 abstract class
具有与“class Item”(上面提供的)中类似的注释,Immutables 将生成一个类似于GsonAdapterXXX
,实现了com.google.gson.TypeAdapterFactory
为了能够自动找到这些类,RepositorySetup
使用java.util.ServiceLoader
来自动定位它们。这是相关的代码部分:
GsonBuilder gsonBuilder = new GsonBuilder();
// there are no longer auto-registed from class-path, but from here or if added manually.
gsonBuilder.registerTypeAdapterFactory(new TypeAdapters());
for (TypeAdapterFactory factory : ServiceLoader.load(TypeAdapterFactory.class)) {
gsonBuilder.registerTypeAdapterFactory(factory);
}
return gsonBuilder.create();
抛出异常的原因是由于某种原因这似乎不起作用并抛出以下异常。
更新进一步的研究表明该示例有效,但前提是已编译 jar。这是因为 Immutables 会生成以下文件,该文件实际上将用于查找所有必需的 GsonAdapterXXX
类。
build\classes\java\main\META-INF\services\com.google.gson.TypeAdapterFactory
org.bson.codecs.configuration.CodecConfigurationException: Can't finda codec for interface spyros.stackoverflow.example.ItemThis is a permalink to the source code.
解决方法直接的工作是专门将 GsonAdaptersItem
注册到 GsonBuilder
。以下 Junit 测试有效。
@Test
public void testItemVerbose() {
try {
//repeat what the RepositorySetup#createGson does
GsonBuilder gsonBuilder = new GsonBuilder();
//iterating in this loop
for (TypeAdapterFactory factory : ServiceLoader.load(TypeAdapterFactory.class)) {
//You can see that the ServiceLoader does not find the GsonAdaptersItem
//System.out.println("Factory:"+factory.getClass().getCanonicalName()+" "+factory.toString());
gsonBuilder.registerTypeAdapterFactory(factory);
}
//add the GsonAdaptersItem manually
gsonBuilder.registerTypeAdapterFactory(new GsonAdaptersItem());
Gson gson = gsonBuilder.create();
Item item = ImmutableItem.builder()
.id(1)
.name("one")
.build();
final MongoClient mongo = new MongoClient( "localhost" , 27017 );
final MongoDatabase mongoDatabase=mongo.getDatabase("test");
ItemRepository items =new ItemRepository(
RepositorySetup.builder()
.executor(MoreExecutors.newDirectExecutorService())
.database(mongoDatabase)
.gson(gson).build()
);
// Insert async and get
items.insert(item).get(); // returns future, works
}catch (final Exception e){
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
此解决方法可用于手动创建通用 API,程序员需要提供 GsonAdapterXXX
。例如。 ItemRepository itemRepository=reporitoryProvider.getRepositoryWithRegisteredGsonAdapter(new GsonAdaptersItem());
还可以创建更具体的 XXXRepository
提供程序。
public ItemRepository getItemRepository(){
return reporitoryProvider.getRepositoryWithRegisteredGsonAdapter(new GsonAdaptersItem());
}
但是,以上所有内容都需要维护,更容易出错,并且无论如何都需要编写样板代码,而这是使用 Immutables 的人希望避免的。
问题
我希望该示例能够像 immutables site 中所示那样工作.我最好的猜测是,因为我使用 gradle 而不是 maven,所以我可能需要更改一些设置或依赖项。问题是:需要更改什么才能使简单的 ItemRepository 创建(如下所示)起作用?
//Simple ItemRepository creation
ItemRepository items = new ItemRepository(
RepositorySetup.forUri("mongodb://localhost/test")
);
是否可以使用 Immutables 来做到这一点,而无需手动编写逐个类或逐个包地注册编解码器的代码?如果能解释为什么它一开始就不起作用,我将不胜感激。
最佳答案
我在一段时间后重新审视这个老问题。目前建议的解决方案是使用 criteria不可变的功能。
@Value.Immutable
@Criteria.Repository
public abstract class Item {
@Criteria.Id
public abstract long id();
public abstract String name();
}
关于java - MongoDB 的不可变自动生成存储库抛出 "Can' t 为接口(interface)“CodecConfigurationException 找到编解码器”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56682703/
这个问题在这里已经有了答案: Different ways of loading a file as an InputStream (6 个答案) 关闭 8 年前。 在我的 gradle java
给定一个 User 类: class User end 我想使用 .class_eval 定义一个新常量.所以: User.class_eval { AVOCADO = 'fruit' } 如果我尝试
这可能听起来很奇怪,但我正在开发一个需要查找 div 内的元素或 div 本身的插件。 脚本根据用户选择查找元素,但内容(包括标记)是可变的。因此脚本将按如下方式查找元素: $('.block').f
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我需要在按我自己的函数排序的对的多集中查找并删除一个值。显然, .find 总是将迭代器返回到末尾,而不是返回到搜索到的值。有小费吗?这是函数: struct cmp { bool operato
求助!我将如何通过遍历查看字符并计算有效字符出现之前的下划线数量来查找和删除前导下划线。以及从字符串末尾向后迭代以查找任何尾随下划线。 我可以使用下面的方法来删除下划线,但是如何迭代才能找到下划线。
如果你在 $(xml) 中有下面的 xml,你会变得懒惰: $(xml).find("animal").find("dog").find("beagle").text() 在 jQuery 中是否有类
你如何找到4个文件的交集? 我用了grep -Fx -f 1.txt 2.txt 3.txt 4.txt ,但它似乎只适用于 2 个文件。同样comm -12 1.txt 2.txt无法扩展为 4 个
我已经完成了标记的姿势估计并获得了 rvec 和 tvec 值。我不知道如何找到它的中心,因为我需要绘制一个需要中心值的圆柱体。 我该怎么做? 最佳答案 标记的 tvec 是标记从原点的平移 (x,y
我有一个任务,我需要找到 2 个单链接(单对单)列表的交集。我还必须为 2 个双向链接(双重 vs 双重)列表执行此操作: 对于单链表,我使用 mergeSort() 对两个列表进行排序,然后逐项比较
我是 R 的新手,我有一个 100x100 的方阵。我想找到这个矩阵的最大特征值。我试过了 is.indefinite(x) 但是它写 is.indefinite(x) : argument x is
您好,我是 svg 和 JavaScript 的新手,当鼠标位于 svg 上方时,我试图使一些 svg 元素弹出(通过缩放),反之亦然,当鼠标离开 svg 元素时。 我已经能够通过使用转换使 svg
我正在尝试为 scala 项目编写一个类,但在多个地方使用 class、def、while 等关键字出现此错误。 它发生在这样的地方: var continue = true while (conti
我有两个 pandas 数据框,它们只取自一列并将日期列设置为索引,所以现在我有两个 Series。我需要找到这些系列的相关性。 这里有几行来自dfd: index change 2018-
我正在尝试调整我的 Vagrantfile,因此如果它丢失,它会自动在项目根目录中创建一个文件夹。创建文件夹没问题,但我无法找到创建该文件夹的位置。 我发现此信息可在 Vagrant::Environ
我正在尝试在 jquery 中找到 Test3 的位置,请有人引导我走上正确的道路。 我需要jquery来显示5 Test7 Test2 Test6 Test5 Test3 Test8 谢谢 最佳
大家早上好 我有一个像这样的图像列表: 使用 jQuery 如何查找 ul#preload 中包含特定字符串(例如“green”)的所有图像 src 类似... var new_src = j
我正在开发一个修改 Excel 文件的应用程序。 如何找到任意行中最后使用的单元格? 示例:行号 => 5 中最后使用的单元格 最佳答案 要找到一行中的最后一个单元格,您需要 Range 的 End
我刚刚陷入 react native ,需要一些帮助才能在找到 token 时导航到 protected 屏幕。我应该在哪里寻找应用程序加载时的 token ?如何在不多次调用导航的情况下导航用户一次
非常奇怪...此页面是 protected 内容还是我不知道的内容?我尝试单击下一页 anchor 。 参见this page first. 我试图用这个来抓取元素 var buttonNext =
我是一名优秀的程序员,十分优秀!