javax验证在Karaf中找不到Hibernate Validator

时间:2017-06-04 00:37:19

标签: maven osgi bean-validation hibernate-validator karaf

我使用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&amp;Bundle-SymbolicName=javax.validation&amp;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&amp;Bundle-SymbolicName=hibernate-validator-annotation-processor&amp;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&amp;Bundle-SymbolicName=hibernate-validator-osgi-karaf-features&amp;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考试中配置或配置其他调试吗?这可以提供帮助吗?

2 个答案:

答案 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)

这为我解决了问题

https://access.redhat.com/documentation/en-us/red_hat_jboss_fuse/6.2/html/apache_cxf_development_guide/Validation#Validation-Intro-Resolver

阅读“在OSGi中显式配置验证提供程序”

问题在于,在OSGI中,CXF无法自动找到提供程序,因此您必须通过将休眠验证器作为构造函数参数传递给CXF Bean验证提供程序来手动解决。

希望这会有所帮助:)