Java JBoss+;RestEasy+;Jackson:org.jboss.resteasy.core.ServerResponse不能强制转换为org.jboss.resteasy.specimpl.BuiltResponse
我使用JBoss(AS 7.1)、RestEasy和Jackson开发RESTAPI。web服务返回一个“Account”对象,它是一个简单的POJO,过去用JSon进行序列化没有任何问题 在代码中进行一些修改后,服务器在每次调用我的方法后都会弹出一个异常。执行:Java JBoss+;RestEasy+;Jackson:org.jboss.resteasy.core.ServerResponse不能强制转换为org.jboss.resteasy.specimpl.BuiltResponse,java,json,jboss,jackson,resteasy,Java,Json,Jboss,Jackson,Resteasy,我使用JBoss(AS 7.1)、RestEasy和Jackson开发RESTAPI。web服务返回一个“Account”对象,它是一个简单的POJO,过去用JSon进行序列化没有任何问题 在代码中进行一些修改后,服务器在每次调用我的方法后都会弹出一个异常。执行: @POST @Path("/auth") @Produces(MediaType.APPLICATION_JSON) public Account authentification(final Account account) thr
@POST
@Path("/auth")
@Produces(MediaType.APPLICATION_JSON)
public Account authentification(final Account account) throws AuthenticationException {
Logger.debug(this, "Authenticate");
Account returnedAccount = // Some authentication code that build a correct Account object
Logger.debug(this, "Authenticated, return now !");
return returnedAccount;
}
按如下方式打印输出:
(DEBUG) Authenticate
(DEBUG) Authenticated, return now !
(ERROR) java.lang.ClassCastException: org.jboss.resteasy.core.ServerResponse cannot be cast to org.jboss.resteasy.specimpl.BuiltResponse
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:340)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:234)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:221)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
at com.mypackage.filter.MyFilter.doFilter(MyFilter.java:55)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
at java.lang.Thread.run(Thread.java:662)
我在谷歌上找到的唯一东西是JBossIssues tracker,但它帮不了我多少忙
任何帮助都将不胜感激 经过大量调查,这个bug来自JBoss库中的冲突。它是在向JBOSS配置添加JMS队列后出现的 为了解决这个问题,我们首先将所有依赖关系都踢到javax.ws.rs-api-x.x<2.0,然后在服务器上更新到javax.ws.rs-api-2.0 为此:
- 添加新的Jar
- 更新module.xml
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="javax.ws.rs.api">
<resources>
<resource-root path="javax.ws.rs-api-2.0.jar"/>
</resources>
<dependencies>
<module name="org.jboss.resteasy.resteasy-jaxrs" services="export"/>
</dependencies>
</module>
要添加到已接受的答案中,如果resteasy公开的方法返回null,则也会出现此ClassCastException。例如:
@POST
@Path("getNotices")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
GetNoticesResponse getNotices(GetNoticesRequest noticesRequest){
return null;
}
根据场景下的一些逻辑,自定义响应对象(GetNoticeResponse)将被org.jboss.resteasy.core.ServerResponse替换,然后再次转换为自定义响应,从而触发ClassCastException
@POST
@Path("getNotices")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
GetNoticesResponse getNotices(GetNoticesRequest noticesRequest){
return null;
}