问题在本文后面进一步说明,但可以归结为:如何让Hibernate Validator 5与RestEasy一起工作? JAX-RS 2.0不需要bean验证1.1吗?或者它将与Bean Validation 1.0一起使用)
我在这篇文章中提供了超出我的问题的信息,为了重现我所做的所有步骤以及我在这一点上遇到的错误,希望它能帮助任何喜欢我的人,希望有一个JAX-RS 2.0( WAS 8.5.5上的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
-----THE SETUP----
a)在RAD中创建一个带有Web模块的耳朵
b)在部署描述符中,对于EAR,我将类加载器模式设置为: parent last ,WAR类加载器策略: module
c)在部署描述符中,对于Web模块,我将类加载器模式设置为: parent last
d)禁用WAS jax-rs引擎(jax-rs 1.1)(添加了JVM arg -Dcom.ibm.websphere.webservices.DisableIBMJAXWSEngine = true)
note on c) :如果我先使用parent,那么WAS附带的JAX-RS 1.1会在我的JAX-RS 2.0 jar之前加载 . 随之而来的是各种错误 .
note on b) :如果我不使用"module",但"application" 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包含在WEB-INF lib中的WAR中
-
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
-
validation-api-1.1.0.Final.jar
并且可选择地
-
hibernate-validator-5.0.1.Final.jar
-
resteasy-hibernatevalidator-provider-3.0.13.Final.jar
-
同学-0.8.0.jar
我之前没有使用maven,在我获得POC(概念证明)工作之前......所有这些jar(例外javax.annotation 1.2)都来自RestEasy 3.0.13下载 .
-----THE PROBLEM ------
我遇到的问题是,当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验证器,并将其删除
- resteasy-validator-provider-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:
-
hibernate-validator-4.3.2.Final.jar
-
hibernate-validator-annotation-processor-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的 Jersey )
额外的信息,因为我也发布这个作为参考,为那些会有同样问题的人...
最终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!"
}
1 回答
事实证明,RestEasy提供了2个bean验证提供程序 .
A) 一个使用绝对Hibernate Validator 4.X的Bean Validation 1.0 . 这与JAX-RS规范无关......我猜它只是一个像其他任何提供者一样的提供者 .
B) Bean Validation 1.1的另一个,它尝试使用CDI或JNDI使用conatainer的bean验证实现提供程序 .
我需要创建自己的提供程序来使用我的特定(hibernate验证器5.x)Bean Validation 1.1实现,因为容器实现是1.0 impl .
这可以使用
org.jboss.resteasy.plugins.validation.AbstractValidatorContextResolver.java
作为基本代码轻松完成