WebSphere 8.5.5 上的 RestEasy 3.0.13:Bean 验证框架版本问题
RestEasy 3.0.13 on WebSphere 8.5.5 : Bean Validation Framework version issue
问题紧接着 post,但可以总结为:如何让 Hibernate Validator 5 与 RestEasy 一起工作? JAX-RS 2.0 不需要 bean 验证 1.1 吗?或者它将与 Bean Validation 1.0 一起使用)
我在此 post 中提供超出我的问题的信息,以便重现我所做的所有步骤和我在这一点上遇到的错误,希望它能帮助像我一样的任何人喜欢在 WAS 8.5.5 上安装 JAX-RS 2.0 (RestEasy impl)。我完全没有找到任何文档,所以这就是我得到的。
我目前正在尝试从 Tomcat 7 上的 Jersey 2.xx、JPA 2.1 迁移到 WAS 8.5.5 上的 RestEasy。我也可以尝试 Apache CXF,但我 运行 解决了其他问题。
我不能在 WAS 中使用 Jersey 和 CDI 因为这个:https://java.net/jira/browse/JERSEY-1933
-----设置----
a) 在 RAD
中使用网络模块创建耳朵
b) 在部署描述符中,对于 EAR,我将 class 加载器模式设置为:parent last, WAR class加载程序策略:模块
c) 在部署描述符中,对于 Web 模块,我将 class 加载程序模式设置为: 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) 的注意事项:如果我不使用 "module",但 "application" class 加载程序策略,我会收到此错误
> 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
中
- activation-1.1.1.jar
- apache-mime4j-0.6.jar
- commons-codec-1.6.jar
- commons-io-2.1.jar
- commons-logging-1.1.3.jar
- jackson-annotations-2.4.1.jar
- jackson-core-2.4.1.jar
- jackson-databind-2.4.1.jar
- jackson-jaxrs-base-2.4.1.jar
- jackson-jaxrs-json-provider-2.4.1.jar
- jackson-module-jaxb-annotations-2.4.1.jar
- javax.annotation-api-1.2.jar
- javax.el-3.0.0.jar
- jaxb-api-2.2.7.jar
- jaxb-core-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-logging-3.1.4.GA.jar
- resteasy-cache-core-3.0.13.Final.jar
- resteasy-cdi-3.0.13.Final.jar
- resteasy-client-3.0.13.Final.jar
- resteasy-jackson2-provider-3.0.13.Final.jar
- resteasy-jaxb-provider-3.0.13.Final.jar
- resteasy-jaxrs-3.0.13.Final.jar
- resteasy-links-3.0.13.Final.jar
- resteasy-multipart-provider-3.0.13.Final.jar
- resteasy-servlet-initializer-3.0.13.Final.jar
- resteasy-validator-provider-11-3.0.13.Final.jar
- stax2-api-3.1.1.jar
- 验证-api-1.1.0.Final.jar
也可选择
- hibernate-validator-5.0.1.Final.jar
- resteasy-hibernatevalidator-provider-3.0.13.Final.jar
- classmate-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 个可选 JAR 以提供一个 Hibernate Validator,并删除了
- resteasy-validator-provider-11-3.0.13.Final.jar
然后我得到这个错误:
class not found : org.hibernate.validator.method.MethodValidator
所以我认为这是一个 Hibernate Validator 4.3 class,它似乎不存在于 hibernate validator 5 中。我继续,删除了 Hibernate Validator jars (classmate + hibernate validators 5 ),并添加了以下 2 个罐子:
- hibernate-validator-4.3.2.Final.jar
- hibernate-validator-annotation-processor-4.3.2.Final.jar
我也删除了这个 jar,因为 hibernate 验证器 4.3 实现了 bean 验证 1.0。
- 验证-api-1.1.0.Final.jar
然后我的 hello JAX-RS 2.0 服务成功了!
我震惊了! JAX-RS 不需要 bean 验证 1.1 才能工作吗?
RestEasy 与 Hib 一起发布的情况如何。 Validator 5.X 和 Hib.Validator 似乎依赖于 Hib Validator 4.X?
有没有人对 RestEasy 有类似的问题?
有什么意见吗?
让我们看看接下来几天还有什么突破! (天哪,我想念 Tomcat 上的泽西岛)
额外的信息,因为我也 post 这可以作为那些有同样问题的人的参考...
最终 JAR 列表:
- activation-1.1.1.jar
- apache-mime4j-0.6.jar
- commons-codec-1.6.jar
- commons-io-2.1.jar
- commons-logging-1.1.3.jar
- hibernate-validator-4.3.2.Final.jar
- hibernate-validator-annotation-processor-4.3.2.Final.jar
- jackson-annotations-2.4.1.jar
- jackson-core-2.4.1.jar
- jackson-databind-2.4.1.jar
- jackson-jaxrs-base-2.4.1.jar
- jackson-jaxrs-json-provider-2.4.1.jar
- jackson-module-jaxb-annotations-2.4.1.jar
- javax.annotation-api-1.2.jar
- javax.el-3.0.0.jar
- jaxb-api-2.2.7.jar
- jaxb-core-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-logging-3.1.4.GA.jar
- resteasy-cache-core-3.0.13.Final.jar
- resteasy-cdi-3.0.13.Final.jar
- resteasy-client-3.0.13.Final.jar
- resteasy-hibernatevalidator-provider-3.0.13.Final.jar
- resteasy-jackson2-provider-3.0.13.Final.jar
- resteasy-jaxb-provider-3.0.13.Final.jar
- resteasy-jaxrs-3.0.13.Final.jar
- resteasy-links-3.0.13.Final.jar
- resteasy-multipart-provider-3.0.13.Final.jar
- resteasy-servlet-initializer-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!"
}
事实证明,RestEasy 提供了 2 个用于 bean 验证的提供程序。
A) 一个用于 Bean Validation 1.0,完全使用 Hibernate Validator 4.X。这与 JAX-RS 规范无关......我猜它只是一个像其他任何供应商一样的供应商。
B) Bean Validation 1.1 的另一个,它试图通过容器使用 Bean 验证实现提供程序,使用 CDI 或 JNDI。
Context context = new InitialContext();
validatorFactory = tmpValidatorFactory = ValidatorFactory.class.cast(context.lookup("java:comp/ValidatorFactory"));
我需要创建自己的提供程序来使用我的特定(休眠验证器 5.x)Bean 验证 1.1 实现,因为容器实现是 1.0 实现。
这可以使用 org.jboss.resteasy.plugins.validation.AbstractValidatorContextResolver.java
作为基本代码轻松完成
问题紧接着 post,但可以总结为:如何让 Hibernate Validator 5 与 RestEasy 一起工作? JAX-RS 2.0 不需要 bean 验证 1.1 吗?或者它将与 Bean Validation 1.0 一起使用)
我在此 post 中提供超出我的问题的信息,以便重现我所做的所有步骤和我在这一点上遇到的错误,希望它能帮助像我一样的任何人喜欢在 WAS 8.5.5 上安装 JAX-RS 2.0 (RestEasy impl)。我完全没有找到任何文档,所以这就是我得到的。
我目前正在尝试从 Tomcat 7 上的 Jersey 2.xx、JPA 2.1 迁移到 WAS 8.5.5 上的 RestEasy。我也可以尝试 Apache CXF,但我 运行 解决了其他问题。
我不能在 WAS 中使用 Jersey 和 CDI 因为这个:https://java.net/jira/browse/JERSEY-1933
-----设置----
a) 在 RAD
中使用网络模块创建耳朵b) 在部署描述符中,对于 EAR,我将 class 加载器模式设置为:parent last, WAR class加载程序策略:模块
c) 在部署描述符中,对于 Web 模块,我将 class 加载程序模式设置为: 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) 的注意事项:如果我不使用 "module",但 "application" class 加载程序策略,我会收到此错误
> 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
中- activation-1.1.1.jar
- apache-mime4j-0.6.jar
- commons-codec-1.6.jar
- commons-io-2.1.jar
- commons-logging-1.1.3.jar
- jackson-annotations-2.4.1.jar
- jackson-core-2.4.1.jar
- jackson-databind-2.4.1.jar
- jackson-jaxrs-base-2.4.1.jar
- jackson-jaxrs-json-provider-2.4.1.jar
- jackson-module-jaxb-annotations-2.4.1.jar
- javax.annotation-api-1.2.jar
- javax.el-3.0.0.jar
- jaxb-api-2.2.7.jar
- jaxb-core-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-logging-3.1.4.GA.jar
- resteasy-cache-core-3.0.13.Final.jar
- resteasy-cdi-3.0.13.Final.jar
- resteasy-client-3.0.13.Final.jar
- resteasy-jackson2-provider-3.0.13.Final.jar
- resteasy-jaxb-provider-3.0.13.Final.jar
- resteasy-jaxrs-3.0.13.Final.jar
- resteasy-links-3.0.13.Final.jar
- resteasy-multipart-provider-3.0.13.Final.jar
- resteasy-servlet-initializer-3.0.13.Final.jar
- resteasy-validator-provider-11-3.0.13.Final.jar
- stax2-api-3.1.1.jar
- 验证-api-1.1.0.Final.jar
也可选择
- hibernate-validator-5.0.1.Final.jar
- resteasy-hibernatevalidator-provider-3.0.13.Final.jar
- classmate-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 个可选 JAR 以提供一个 Hibernate Validator,并删除了
- resteasy-validator-provider-11-3.0.13.Final.jar
然后我得到这个错误:
class not found : org.hibernate.validator.method.MethodValidator
所以我认为这是一个 Hibernate Validator 4.3 class,它似乎不存在于 hibernate validator 5 中。我继续,删除了 Hibernate Validator jars (classmate + hibernate validators 5 ),并添加了以下 2 个罐子:
- hibernate-validator-4.3.2.Final.jar
- hibernate-validator-annotation-processor-4.3.2.Final.jar
我也删除了这个 jar,因为 hibernate 验证器 4.3 实现了 bean 验证 1.0。
- 验证-api-1.1.0.Final.jar
然后我的 hello JAX-RS 2.0 服务成功了!
我震惊了! JAX-RS 不需要 bean 验证 1.1 才能工作吗?
RestEasy 与 Hib 一起发布的情况如何。 Validator 5.X 和 Hib.Validator 似乎依赖于 Hib Validator 4.X?
有没有人对 RestEasy 有类似的问题? 有什么意见吗?
让我们看看接下来几天还有什么突破! (天哪,我想念 Tomcat 上的泽西岛)
额外的信息,因为我也 post 这可以作为那些有同样问题的人的参考...
最终 JAR 列表:
- activation-1.1.1.jar
- apache-mime4j-0.6.jar
- commons-codec-1.6.jar
- commons-io-2.1.jar
- commons-logging-1.1.3.jar
- hibernate-validator-4.3.2.Final.jar
- hibernate-validator-annotation-processor-4.3.2.Final.jar
- jackson-annotations-2.4.1.jar
- jackson-core-2.4.1.jar
- jackson-databind-2.4.1.jar
- jackson-jaxrs-base-2.4.1.jar
- jackson-jaxrs-json-provider-2.4.1.jar
- jackson-module-jaxb-annotations-2.4.1.jar
- javax.annotation-api-1.2.jar
- javax.el-3.0.0.jar
- jaxb-api-2.2.7.jar
- jaxb-core-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-logging-3.1.4.GA.jar
- resteasy-cache-core-3.0.13.Final.jar
- resteasy-cdi-3.0.13.Final.jar
- resteasy-client-3.0.13.Final.jar
- resteasy-hibernatevalidator-provider-3.0.13.Final.jar
- resteasy-jackson2-provider-3.0.13.Final.jar
- resteasy-jaxb-provider-3.0.13.Final.jar
- resteasy-jaxrs-3.0.13.Final.jar
- resteasy-links-3.0.13.Final.jar
- resteasy-multipart-provider-3.0.13.Final.jar
- resteasy-servlet-initializer-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!"
}
事实证明,RestEasy 提供了 2 个用于 bean 验证的提供程序。
A) 一个用于 Bean Validation 1.0,完全使用 Hibernate Validator 4.X。这与 JAX-RS 规范无关......我猜它只是一个像其他任何供应商一样的供应商。
B) Bean Validation 1.1 的另一个,它试图通过容器使用 Bean 验证实现提供程序,使用 CDI 或 JNDI。
Context context = new InitialContext();
validatorFactory = tmpValidatorFactory = ValidatorFactory.class.cast(context.lookup("java:comp/ValidatorFactory"));
我需要创建自己的提供程序来使用我的特定(休眠验证器 5.x)Bean 验证 1.1 实现,因为容器实现是 1.0 实现。
这可以使用 org.jboss.resteasy.plugins.validation.AbstractValidatorContextResolver.java
作为基本代码轻松完成