javax 验证在 Karaf 中找不到 Hibernate Validator

javax validation can't find Hibernate Validator in Karaf

我使用 javax.validation 和 Hibernate Validator 实现了一些代码。使用验证的单元测试工作正常。该构建生成 OSGi 包和功能,并在 Karaf 中生成 运行s。

当我 运行 我的 PaxExam 集成测试时,我得到 "Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath." 据我所知,我正在将它添加到我的 class 路径中。我有一个 features.xml 文件,我一直在向其中逐渐添加依赖项。它终于通过了 Karaf 包解析,但现在它失败了,并出现以下消息:

"Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath."

我会包括堆栈跟踪,但它对我来说似乎没有用。大部分在我的代码、junit 和 paxexam 中。

我正在尝试使用 HV 的 5.4.1.Final 版。再次注意,执行验证的单元测试工作正常。获得正确的依赖项需要一段时间才能做到这一点(比如使用 "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" 文件的摘录,该捆绑包是包含测试 class 的捆绑包的依赖项(按功能):

    <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 文件引用的基础 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.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">

顶级功能元素的“名称”属性 是“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 考试配置中的 "LogLevel" 从警告更改为调试。这给了我更多的 karaf 调试输出,但它没有给我任何关于为什么在 class 路径中找不到 HV 的重要信息。

是否有其他我可以配置的调试,或 Pax 考试中的配置,这对这里有帮助?

看看我们针对 5.4 分支的 Karaf 集成测试:

https://github.com/hibernate/hibernate-validator/tree/5.4/osgi/integrationtest

我们也使用大同考试。如果你按照我们所做的去做,你应该能够让它发挥作用。

顺便说一句,我看到你第二次在你的依赖项中提到注释处理器,它不是你在运行时需要的东西。注释处理器用于检查您使用的注释在编译时是否有意义。您应该只在构建项目时启用它。

在此处查看 Maven 示例:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-annotationprocessor-commandline .

这为我解决了:

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

阅读自"Configuring the validation provider explicitly in OSGi"

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

希望这对您有所帮助 :)