我使用javax.validation和Hibernate Validator实现了一些代码。使用验证的单元测试工作正常。该版本生成OSGi包和功能,并在Karaf中运行。
当我运行PaxExam集成测试时,我得到“无法创建配置,因为找不到Bean验证提供程序。将类似Hibernate Validator(RI)的提供程序添加到类路径中。”据我所知,我将它添加到我的类路径中。我有一个features.xml文件,我一直在增量添加依赖项。它终于通过了Karaf捆绑解决方案,但现在它失败了,但是这条消息有例外:
“无法创建配置,因为找不到Bean验证提供程序。将类似Hibernate Validator(RI)的提供程序添加到类路径中。”
我会包含堆栈跟踪,但它对我来说看起来没用。其中大部分都在我的代码中,junit和paxexam。
我正在尝试使用版本5.4.1.Final的HV。再次注意,进行验证的单元测试工作正常。需要一段时间才能使依赖项正确到达目前(例如使用“javax.el”的版本“3.0.1-b08”。
我见过一些关于“hibernate-validator-osgi-karaf-features”工件的提及,但我不确定这是否相关。我正在尝试使用hibernate-validator工件和hibernate-validator-annotation-processor工件。
我不知道这有什么关系,但这里是我的POM依赖项的摘录:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>
hibernate-validator-annotation-processor
</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
以下是捆绑包中“features.xml”文件的摘录,该捆绑包是包含测试类的捆绑包的依赖关系(按功能):
<bundle start-level="100">wrap:mvn:javax.validation/validation-api/1.1.0.Final$Bundle-Name=javax.validation&Bundle-SymbolicName=javax.validation&Bundle-Version=1.1.0.Final</bundle>
<bundle>mvn:org.hibernate/hibernate-validator/5.4.1.Final</bundle>
<bundle start-level="100">wrap:mvn:org.hibernate/hibernate-validator-annotation-processor/5.4.1.Final$Bundle-Name=hibernate-validator-annotation-processor&Bundle-SymbolicName=hibernate-validator-annotation-processor&Bundle-Version=5.4.1.Final</bundle>
此时我还能做些什么呢?
更新:
我根据“hibernate-validator-osgi-karaf-features”工件的答案进行了一些更改,但我现在遇到了一个不同的意外错误。
在pom依赖项中,我添加了以下内容:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>
hibernate-validator-osgi-karaf-features
</artifactId>
<version>5.4.1.Final</version>
<type>pom</type>
</dependency>
在我的模块中的features.xml文件引用的base features.xml文件中,我删除了注释处理器,并添加了:
<bundle>wrap:mvn:org.hibernate/hibernate-validator-osgi-karaf-features/5.4.1.Final$Bundle-Name=hibernate-validator-osgi-karaf-features&Bundle-SymbolicName=hibernate-validator-osgi-karaf-features&Bundle-Version=5.4.1.Final</bundle>
我试过没有“wrap:”和“$”之后的所有内容,但结果是一样的。
当我进行测试时,我看到了这个:
Caused by: shaded.org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact org.hibernate:hibernate-validator-osgi-karaf-features:jar:5.4.1.Final in central (http://repo1.maven.org/maven2/)
at shaded.org.eclipse.aether.connector.basic.ArtifactTransportListener.transferFailed(ArtifactTransportListener.java:39)[7:org.ops4j.pax.url.mvn:2.4.7]
at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:355)[7:org.ops4j.pax.url.mvn:2.4.7]
at shaded.org.eclipse.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:67)[7:org.ops4j.pax.url.mvn:2.4.7]
at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute(BasicRepositoryConnector.java:581)[7:org.ops4j.pax.url.mvn:2.4.7]
at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(BasicRepositoryConnector.java:249)[7:org.ops4j.pax.url.mvn:2.4.7]
at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:520)[7:org.ops4j.pax.url.mvn:2.4.7]
at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:421)[7:org.ops4j.pax.url.mvn:2.4.7]
... 16 more
很奇怪它说它无法在中心找到它。我可以验证工件是我的本地maven缓存,因为在我添加了maven依赖项后,我的构建可能会将其复制到那里。
更新:
我猜我的部分问题是这个工件是POM工件,而不是JAR工件,但我不明白我需要如何引用它。
更新:
karaf-user上有人指出我需要将其作为一个功能引用,而不是捆绑,所以我现在用以下内容替换我的捆绑引用:
<feature>hibernate-validator-osgi-karaf-features</feature>
以下两个存储库定义旁边的存储库定义:
<repository>mvn:org.hibernate/hibernate-validator-osgi-karaf-features/5.4.1.Final/xml/features</repository>
但是,安装功能文件然后重新运行我的测试后,它会失败:
org.osgi.service.resolver.ResolutionException: Unable to resolve root: missing requirement [root] osgi.identity; osgi.identity=usl-fraudcheck; type=karaf.feature; version="[2.5.0.SNAPSHOT,2.5.0.SNAPSHOT]"; filter:="(&(osgi.identity=usl-fraudcheck)(type=karaf.feature)(version>=2.5.0.SNAPSHOT)(version<=2.5.0.SNAPSHOT))" [caused by: Unable to resolve usl-fraudcheck/2.5.0.SNAPSHOT: missing requirement [usl-fraudcheck/2.5.0.SNAPSHOT] osgi.identity; osgi.identity=usl-base; type=karaf.feature [caused by: Unable to resolve usl-base/2.5.0.SNAPSHOT: missing requirement [usl-base/2.5.0.SNAPSHOT] osgi.identity; osgi.identity=hibernate-validator-osgi-karaf-features; type=karaf.feature]]
正如我现在所习惯的那样,这里引用的最后一个身份是它无法找到的东西,不出所料我正在引用这个新功能。
然后我验证了以下文件存在:
~/.m2/repository/org/hibernate/hibernate-validator-osgi-karaf-features/5.4.1.Final/hibernate-validator-osgi-karaf-features-5.4.1.Final-features.xml
然而,我发现它开始时有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0"
name="hibernate-validator-osgi-features"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.4.0">
顶级要素元素的“name”属性是“hibernate-validator-osgi-features”,而不是“hibernate-validator-osgi-karaf-features”。这是一个问题吗?
更新:
我现在明白我的功能文件必须引用名为“hibernate-validator”的功能,该功能在“hibernate-validator-osgi-karaf-features”工件中定义。这似乎解决了我的Karaf包解决问题。但是,这只会让我回到原来的问题:
Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
我尝试将Pax Exam配置中的“LogLevel”从WARNING更改为DEBUG。这给了我更多karaf调试输出,但它没有给我任何有关为什么在类路径中找不到HV的重要信息。
我可以在Pax考试中配置或配置其他调试吗?这可以提供帮助吗?
答案 0 :(得分:0)
请看一下5.4分支的Karaf集成测试:
https://github.com/hibernate/hibernate-validator/tree/5.4/osgi/integrationtest
我们也使用Pax考试。如果你按照我们的方式行事,你应该能够使它发挥作用。
顺便说一下,我看到你第二次在你的依赖中提到了注释处理器,它不是你在运行时需要的东西。注释处理器用于检查您使用的注释在编译时是否有意义。您只应在构建项目时启用它。
请参阅此处的Maven示例:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-annotationprocessor-commandline。
答案 1 :(得分:0)
这为我解决了问题
阅读“在OSGi中显式配置验证提供程序”
问题在于,在OSGI中,CXF无法自动找到提供程序,因此您必须通过将休眠验证器作为构造函数参数传递给CXF Bean验证提供程序来手动解决。
希望这会有所帮助:)