WebSphere 8.5.5上的RestEasy 3.0.13:Bean Validation Framework版本问题

时间:2016-01-21 14:06:55

标签: websphere jax-rs resteasy bean-validation hibernate-validator

问题紧接着这篇文章,但可以归结为:如何让Hibernate Validator 5与RestEasy一起工作?是不是JAX-RS 2.0需要bean验证1.1?或者它是否适用于Bean Validation 1.0)

我在这篇文章中提供了超出我的问题的信息,为了重现我所做的所有步骤以及我在这一点上遇到的错误,希望它能帮助任何喜欢我的人,希望有一个JAX- WAS 8.5.5上的RS 2.0(RestEasy impl)。我发现完全没有文档,所以这就是我得到的。

我目前正试图从Tomcat 7上的Jersey 2.xx,JPA 2.1转移到WAS 8.5.5上的RestEasy。我也可以尝试Apache CXF,但我遇到了其他问题。

我不能在WAS中使用带有CDI的Jersey,因为:https://java.net/jira/browse/JERSEY-1933

-----设置----

a)在RAD

中创建一个带有Web模块的耳朵

b)在部署描述符中,对于EAR,我将类加载器模式设置为: parent last ,WAR classloader策略:模块

c)在部署描述符中,对于Web模块,我将类加载器模式设置为: parent last

d)禁用WAS jax-rs引擎(jax-rs 1.1)(添加了JVM arg -Dcom.ibm.websphere.webservices.DisableIBMJAXWSEngine = true)

关于c)的注释:如果我先使用父级,WAS附带的JAX-RS 1.1将在我的JAX-RS 2.0 jar之前加载。各种错误都会随之而来。

关于b)的说明:如果我不使用"模块",但是"应用程序" classloader策略,我收到此错误

> Provider org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer
> not a subtype

我在web.xml中设置了RestEasy servlet

<servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.mydomain.RestEasyConfig</param-value>
    </init-param>

    <init-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </init-param>

    <init-param>
        <param-name>resteasy.servlet.context.deployment</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

以下jar包含在我的WAR中的WEB-INF lib

  • 活化-1.1.1.jar
  • Apache的mime4j-0.6.jar
  • 公地编解码器-1.6.jar
  • 公地-IO-2.1.jar
  • 共享记录-1.1.3.jar
  • 杰克逊 - 注解-2.4.1.jar
  • 杰克逊 - 芯 - 2.4.1.jar
  • 杰克逊 - 数据绑定-2.4.1.jar
  • 杰克逊 - JAXRS碱基2.4.1.jar
  • 杰克逊 - JAXRS-JSON-提供商-2.4.1.jar
  • 杰克逊模块-JAXB的注解-2.4.1.jar
  • javax.annotation中-API-1.2.jar
  • javax.el-3.0.0.jar
  • JAXB-API-2.2.7.jar
  • JAXB核-2.2.7.jar
  • JAXB-IMPL-2.2.7.jar
  • 的JBoss-EL-api_3.0_spec-1.0.0.Final.jar
  • 的JBoss-JAXRS-api_2.0_spec-1.0.0.Final.jar
  • 的JBoss-测井3.1.4.GA.jar
  • RestEasy的高速缓冲存储器核-3.0.13.Final.jar
  • RestEasy的-CDI-3.0.13.Final.jar
  • RestEasy的客户端 - 3.0.13.Final.jar
  • RestEasy的-jackson2提供商-3.0.13.Final.jar
  • RestEasy的-JAXB提供商-3.0.13.Final.jar
  • RestEasy的-JAXRS-3.0.13.Final.jar
  • RestEasy的链接-3.0.13.Final.jar
  • RestEasy的-多提供商-3.0.13.Final.jar
  • RestEasy的-servlet的初始化-3.0.13.Final.jar
  • RestEasy的验证器提供商-11-3.0.13.Final.jar
  • stax2-API-3.1.1.jar
  • 验证-API-1.1.0.Final.jar

并且可选择

  • 冬眠验证器-5.0.1.Final.jar
  • RestEasy的-hibernatevalidator提供商-3.0.13.Final.jar
  • 同学-0.8.0.jar

我现在没有使用maven,在我获得POC(概念证明)工作之前......所有这些jar(例外javax.annotation 1.2)都来自RestEasy 3.0.13下载。

-----问题------

我遇到的问题是,当ReatEasy尝试加载其配置时,它会抱怨它无法找到验证实现。据我所知,容器应该带有bean验证实现,但RestEasy无法找到它。

> Caused by: javax.validation.ValidationException: Unable to create a
> Configuration, because no Bean Validation provider could be found. Add
> a provider like Hibernate Validator (RI) to your classpath.   at
> javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:271)
>   at
> org.jboss.resteasy.plugins.validation.AbstractValidatorContextResolver.getConfig(AbstractValidatorContextResolver.java:78)

然后我添加上面列出的3个optionnal JAR以提供Hibernate Validator,并删除

  • RestEasy的验证器提供商-11-3.0.13.Final.jar

然后我收到此错误:

class not found : org.hibernate.validator.method.MethodValidator

所以我认为这是一个Hibernate Validator 4.3类,它似乎不存在于hibernate验证器5中。我继续,删除了Hibernate Validator jar(同学+ hibernate验证器5),并添加了以下2个jar:

  • 冬眠验证器-4.3.2.Final.jar
  • 冬眠验证器的注释处理器的4.3.2.Final.jar

我也删除了这个jar,因为hibernate验证器4.3实现了bean验证1.0。

  • validation-api-1.1.0.Final.jar

然后我的你好JAX-RS 2.0服务工作了!

我很震惊! JAX-RS是否需要bean验证1.1才能工作?

RestEasy如何与Hib一起发售。 Validator 5.X和Hib.Validator似乎依赖于Hib Validator 4.X?

有没有人与RestEasy有类似的问题? 有什么意见吗?

让我们看看未来几天还有什么突破! (上帝我想念Tomcat的泽西岛)

额外的信息,因为我也发布此信息作为那些有同样问题的人的参考...

最终JAR清单:

  • 活化-1.1.1.jar
  • Apache的mime4j-0.6.jar
  • 公地编解码器-1.6.jar
  • 公地-IO-2.1.jar
  • 共享记录-1.1.3.jar
  • 冬眠验证器-4.3.2.Final.jar
  • 冬眠验证器的注释处理器的4.3.2.Final.jar
  • 杰克逊 - 注解-2.4.1.jar
  • 杰克逊 - 芯 - 2.4.1.jar
  • 杰克逊 - 数据绑定-2.4.1.jar
  • 杰克逊 - JAXRS碱基2.4.1.jar
  • 杰克逊 - JAXRS-JSON-提供商-2.4.1.jar
  • 杰克逊模块-JAXB的注解-2.4.1.jar
  • javax.annotation中-API-1.2.jar
  • javax.el-3.0.0.jar
  • JAXB-API-2.2.7.jar
  • JAXB核-2.2.7.jar
  • JAXB-IMPL-2.2.7.jar
  • 的JBoss-EL-api_3.0_spec-1.0.0.Final.jar
  • 的JBoss-JAXRS-api_2.0_spec-1.0.0.Final.jar
  • 的JBoss-测井3.1.4.GA.jar
  • RestEasy的高速缓冲存储器核-3.0.13.Final.jar
  • RestEasy的-CDI-3.0.13.Final.jar
  • RestEasy的客户端 - 3.0.13.Final.jar
  • RestEasy的-hibernatevalidator提供商-3.0.13.Final.jar
  • RestEasy的-jackson2提供商-3.0.13.Final.jar
  • RestEasy的-JAXB提供商-3.0.13.Final.jar
  • RestEasy的-JAXRS-3.0.13.Final.jar
  • RestEasy的链接-3.0.13.Final.jar
  • RestEasy的-多提供商-3.0.13.Final.jar
  • RestEasy的-servlet的初始化-3.0.13.Final.jar
  • stax2-API-3.1.1.jar

RestEasyConfig.java

@ApplicationPath("/services")
public class RestEasyConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {

        Set<Class<?>> classes = new HashSet<Class<?>>();

        classes.add(TestService.class);
        return classes;

    }

}

TestService.java

@Path("/test")
public class TestService extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAccount() {

        String ok = "OK!";

        Map<String, String> map = new HashMap<String, String>();
        map.put("response", ok);

        Response response = Response.ok().entity(map).build();

        return response;
    }

}

结束点:https://localhost:9445/jaxrs2web/rest/test

结果:

{
    "response": "OK!"
}

1 个答案:

答案 0 :(得分:3)

因此,事实证明RestEasy提供了2个bean验证提供程序。

A)一个使用绝对Hibernate Validator 4.X的Bean Validation 1.0。这与JAX-RS规范无关......我猜它只是一个像其他任何提供者一样的提供者。

B) Bean Validation 1.1的另一个,它尝试使用CDI或JNDI使用conatainer的bean验证实现提供程序。

Context context = new InitialContext();
validatorFactory = tmpValidatorFactory = ValidatorFactory.class.cast(context.lookup("java:comp/ValidatorFactory"));

我需要创建自己的提供者来使用我的特定(hibernate验证器5.x)Bean Validation 1.1实现,因为容器实现是1.0 impl。

使用org.jboss.resteasy.plugins.validation.AbstractValidatorContextResolver.java作为基本代码

可以轻松完成此操作