当前位置: 首页 > 知识库问答 >
问题:

javax验证在Karaf中找不到Hibernate验证器

麹渊
2023-03-14

我使用javax.validation和Hibernate验证器实现了一些代码。使用验证的单元测试工作良好。该构建生成OSGi包和特性,并在Karaf中运行。

“无法创建配置,因为找不到Bean验证提供程序。请将Hibernate Validator(RI)这样的提供程序添加到类路径中。”

我会包括stacktrace,但它对我来说没有什么用。大部分都在我的代码、junit和Paxexam中。

我正在尝试使用HV的5.4.1.final版本。再次注意,执行验证的单元测试工作良好。它花了一段时间来获得正确的依赖关系以达到这个程度(比如使用“javax.el”的“3.0.1-B08”版本)。

        <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>

下面是来自bundle的“features.xml”文件的节选,该bundle是包含测试类的bundle的依赖项(按特性):

    <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>

在这一点上我还能做什么?

更新:

    <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$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上有人指出,我需要将它作为一个特性引用,而不是一个bundle,所以我现在用以下内容替换了我的bundle引用:

<feature>hibernate-validator-osgi-karaf-features</feature>

以及以下存储库定义和其他两个存储库定义:

    <repository>mvn:org.hibernate/hibernate-validator-osgi-karaf-features/5.4.1.Final/xml/features</repository>

但是,在安装features文件并重新运行我的测试之后,它失败了,原因如下:

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">

顶级features元素的“name”属性是“hibernate-validator-osgi-features”,而不是“hibernate-validator-osgi-karaf-features”。有问题吗?

更新:

我现在明白了,我的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”从WARNING更改为debug。这给了我更多的karaf调试输出,但它没有给我任何重要的信息,说明为什么在类路径中找不到HV。

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

共有1个答案

戚泰
2023-03-14

请看一下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。

 类似资料:
  • 我有一个使用javax注释的jax-rs项目(

  • 我需要应用一个双值验证,这需要与圆周率匹配。我正在考虑使用@pattern(regex=“3.14159265359”)。这是使用Hibernate验证约束应用这样一个约束的最佳方式吗?谢谢

  • 我对Spring靴有疑问。如何对Spring转换器进行验证?我试图从javax使用ConstraintValidator,但它在转换器之后运行。

  • 我现在把这两者搞混了。我知道Hibernate Validator6是Bean验证2.0规范的参考实现。它支持分组、错误消息国际化、自定义方法验证等。问题是Spring5支持这些特性还是我只剩下Hibernate Validator6了? 网上所有的参考例子都建议使用Hibernate验证器,没有什么关于Spring验证的发现,请建议或指向其他链接。

  • 我的springboot版本是2.3.7。我知道spring boot starter验证不是spring boot starter web的可传递依赖项。但即使单独添加了它,我的注释也不起作用。 //下面的依赖我已经添加build.gradle编译'org.springframework.boot: spring-boot-starter-validation' //我希望在请求时出错的示例类

  • 我试图使用swagger来记录我的Restapi,并且取得了一些成功,但是在受限资源参数方面,我遇到了一堵墙。我正在使用JBoss RESTEasy与Hibernate验证器提供程序和Jackson 2.x注释的POJO。我遇到的问题是,当遇到@DecimalMin/@DecimalMax注释时,我得到一个 似乎swagger正在尝试使用较新版本的javax.validation.constrai