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

在osgi-container中找不到hibernate-validator的El实现

百里涛
2023-03-14

我尝试在osgi容器中运行Hibernate验证器。

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>2.2.4</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.4</version>
</dependency>

<dependency>
    <groupId>org.apache.servicemix.bundles</groupId>
    <artifactId>org.apache.servicemix.bundles.hibernate-validator</artifactId>
    <version>5.0.2.Final_1</version>
</dependency>

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.7</version>
</dependency>

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.8.1</version>
</dependency>


public class HibernateValidationProviderResolver implements ValidationProviderResolver {
    @Override
    public List<ValidationProvider<?>> getValidationProviders() {
        List<ValidationProvider<?>> list = new ArrayList<>(1);
        list.add(new HibernateValidator());
        return list;
    }
}


Configuration<?> configuration = Validation.byDefaultProvider().providerResolver(
    new HibernateValidationProviderResolver()
).configure();

ValidatorFactory validatorFactory = configuration.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
Set<ConstraintViolation<Group>> constraintViolations = validator.validate(group);


public class Group {
    @NotNull
    @Size(min=2)
    private String title;
}

试着运行,equinox控制台没问题:

10      RESOLVED    org.glassfish.web.javax.el_2.2.4
39      RESOLVED    org.apache.servicemix.bundles.hibernate-validator_5.0.2.Final_1
47      RESOLVED    javax.validation.api_1.1.0.Final
49      RESOLVED    javax.el-api_2.2.4

如果传递具有title=null的Group class instance,那么验证就可以了,ConstraintVioldings包含一个违规“not null”。如果传递具有title=“a”的Group class实例(一个字符,最小长度=2),则会引发异常

Caused by: javax.el.ELException: Provider com.sun.el.ExpressionFactoryImpl not found
Caused by: java.lang.ClassNotFoundException: com.sun.el.ExpressionFactoryImpl

更新1

Maven: javax.el:javax.el-api:2.2.4

Export-Package: javax.el;version="2.2.4"
Import-Package: javax.el;version="2.2.4"

Maven: org.glassfish.web:javax.el:2.2.4 MANIFEST.MF

Export-Package: com.sun.el;uses:="javax.el";version="2.2.4"
Private-Package: com.sun.el.lang;version="2.2.4",com.sun.el.parser;version="2.2.4",com.sun.el.util;version="2.2.4"
Import-Package: com.sun.el;version="2.2.4",javax.el;version="2.2"

Maven: org.apache.servicemix.bundles:org.apache.servicemix.bundles.hibernate-validator:5.0.2.Final_1

Implementation-Version: 5.0.2.Final
Import-Package: javax.el,javax.persistence;resolution:=optional, ...

Export-Package: org.hibernate.validator.internal.engine.messageinterpola
tion.el;uses:="javax.el,javax.validation,org.hibernate.validator.intern
al.engine.messageinterpolation";version="5.0.2.Final",org.hibernate.val
idator.internal.engine.messageinterpolation;uses:="javax.validation.met
adata,org.hibernate.validator.internal.engine.messageinterpolation.el,j
avax.el,javax.validation,org.hibernate.validator.internal.util.logging"
;version="5.0.2.Final", ...

在hibernate bundle中导入的任何版本,在el-api和el-impl的导出中的2.2.4和el-impl将el-api作为2.2而不是2.2.4导入。所有包都已解析。

更新2

决定1

我对@Hwellmann想法的实现。@Hwellmann对吗?

public void createGroup(Group group) {
    ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader();

    try {
        ClassLoader[] classLoaders = new ClassLoader[] {
            prevClassLoader,
            ExpressionFactoryImpl.class.getClassLoader()
        };

        // build composite classloader

        Thread.currentThread().setContextClassLoader(compositeClassLoader);

        Set<ConstraintViolation<Group>> constraintViolations = validator.validate(group);

    } finally {
        Thread.currentThread().setContextClassLoader(prevClassLoader);
    }
}

当我将自己的消息属性添加到每个验证注释(例如group:

public class Group {
    @NotNull
    @Size(min=2, message="field.too_short")
    private String title;
}

在本例中,似乎未启动hibernate插值器,因此未从TCCL检索expressionFactoryImpl(以前我们读取min=2值,现在不读取)。如果对我们来说可以的话,这个决定是最简单的。我将进一步调查这一领域,并在那里分享我的观察。

共有1个答案

太叔富
2023-03-14

完整的堆栈跟踪可能比仅提供异常消息提供更多的洞察力。

我猜测您正在通过meta-inf/service/javax.el.expressionFactory看到一个失败的服务查找的结果。进行查找的包显然看不到com.sun.el

将此包导入应用程序包并将线程上下文类加载器设置为包类加载器可能会有所帮助。

 类似资料:
  • 我正在开发一个应用程序,它利用Hibernate框架将OSGi转换为更具体的Equinox Server。因此,我生成了库包和客户端插件,我在其中利用前面提到的库包对业务逻辑和数据库之间的通信进行编程。在我的项目中,我有以下包结构: 在管理器包中,我有那些负责将客户端与数据库和映射进行通信的类,其中一个包含配置文件和Hibernate映射文件。然而,当我部署捆绑包时,引用运行良好,但是我得到一个异

  • 我正在尝试在Karaf2.3中安装并启动OSGi用户管理界面的ApacheFelix实现。3. 但是,这个包从来没有得到解决,我在开始时得到以下错误: 正如我在Karaf邮件列表中读到的,Karaf已经嵌入了OSGi概要API,但默认情况下不会导出所有包。我更改了文件以显式导出UserAdmin包: 包似乎是由Karaf导出的,正如我在运行

  • 嗨,我刚遇到一个问题:OSGI无法启动,因为它找不到类:org/restlet/engine/adapter/httpserverhelper但我已经把它添加到任何地方(src,import-packes,plugins),但仍然得到这个错误,任何人可以帮助我吗?!谢谢

  • Overview JSR303 BeanValidator是JavaEE后期少有的实用规范了。既可以做REST/SOAP接口的参数校验,Spring MVC也与之绑定做了Form校验。 Hibernate Validator 是唯一成熟的实现,在标准校验规则之外还添加了自己的一些规则,详见其参考手册。 Hibernate Validator有中英文版本的参考手册. 除了标准的简单使用,高级点还可以

  • 以下示例说明如何使用Spring Web MVC框架在表单中使用错误处理和验证器。 首先,让我们使用一个可用的Eclipse IDE,并遵循以下步骤,使用Spring Web Framework开发基于动态表单的Web应用程序。 步 描述 1 在Spring MVC - Hello World章节中解释,在com.wenjiangs包下创建一个名为TestWeb的项目。 2 在com.wenjia

  • 用Annotations 给类或者类的属性加上约束(constraint),在运行期检查属性值是很优雅的.Hibernate Validator就是这样的一个框架.该框架是十分容易的(就像参考文档中宣称的那样),几乎没有什么学习曲线,Validator 是一个验证框架 不需要和Hibernate的其他部分绑定就可以使用,只要在你的项目中添加Hibernate-annotations.jar库就可以