Java JBoss+;RestEasy+;Jackson:org.jboss.resteasy.core.ServerResponse不能强制转换为org.jboss.resteasy.specimpl.BuiltResponse

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

我使用JBoss(AS 7.1)、RestEasy和Jackson开发RESTAPI。web服务返回一个“Account”对象,它是一个简单的POJO,过去用JSon进行序列化没有任何问题

在代码中进行一些修改后,服务器在每次调用我的方法后都会弹出一个异常。执行:

@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
wgethttps://repository.liferay.com/nexus/content/groups/public/javax/ws/rs/javax.ws.rs-api/2.0/javax.ws.rs-api-2.0.jar -O/usr/local/bin/jboss-as-7.1.1.Final/modules/javax/ws/rs/api/main/javax.ws.rs-api-2.0.jar&&md5sum/usr/local/bin/jboss-as-7.1.1.Final/modules/javax/ws/rs/api/main/javax.ws.rs-api-2.0.jar 确保打印的MD5是3bc8176d36becb7746e1f2594346ed66,否则它不是好的包装

  • 更新module.xml
再次在“/usr/local/bin/jboss-as-7.1.1.Final/modules/javax/ws/rs/api/main”中更改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;
}