2014-06-05 34 views
0

我使用JBoss(AS 7.1),RestEasy和Jackson開發REST API。 Web服務返回一個「Account」對象,這是一個簡單的POJO,它曾經在JSon中序列化,沒有任何問題。JBoss + RestEasy + Jackson:org.jboss.resteasy.core.ServerResponse無法轉換爲org.jboss.resteasy.specimpl.BuiltResponse

在代碼中進行了一些修改之後,服務器在每次調用我的方法後都會彈出一個異常。

@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) 

我對谷歌發現的唯一的事情是this ticket在JBoss的問題追蹤器,但它並沒有太大的幫助。

任何幫助將不勝感激!

回答

0

經過大量調查,這個錯誤來自JBoss庫中的衝突。在將JMS隊列添加到我們的JBOSS配置後出現了。

爲了解決這個問題,我們首先將所有的依賴關係踢出了javax.ws.rs-api-x.x < 2.0,然後我們在服務器上更新爲javax.ws.rs-api-2.0。

爲了做到這一點:

  • 添加新的JAR
 
wget https://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> 
1

要添加到接受的答案,這ClassCastException異常也可能會出現,如果你的方法,通過RestEasy的返回NULL暴露。例如:

@POST 
@Path("getNotices") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
GetNoticesResponse getNotices(GetNoticesRequest noticesRequest){ 
    return null; 
} 

通過一些下的幕後邏輯,定製響應對象(GetNoticesResponse)將得到由org.jboss.resteasy.core.ServerResponse置換,然後澆鑄到定製響應再次,觸發ClassCastException異常。

相關問題