2012-11-21 51 views
10

我們正試圖從我們班採取了所有的註釋,並在spring-config.xml配置它指定annotatedMethod。REST服務:如何在不使用註釋

spring-config.xml看起來像

<jaxrs:server id="restServer" address="/rest/"> 
     <jaxrs:model id="restModel"> 
      <jaxrs:resource name="com.csc.fs.rest.contact.RetrieveContactHistoryBP" path="retrieveContactHistoryBP"> 
       <jaxrs:operation name="retrieve" path="{partyId}" consumes="application/json" produces="application/json" verb="GET"> 
        <jaxrs:param name="req" type="CONTEXT"/> 
        <jaxrs:param name="partyId" type="PATH"/> 
       </jaxrs:operation> 
      </jaxrs:resource> 
      <jaxrs:resource name="com.csc.fs.rest.contact.StartContactBP" path="startContactBP"> 
       <jaxrs:operation name="startContact" path="/" consumes="application/json" produces="application/json" verb="PUT"> 
        <jaxrs:param name="req" type="CONTEXT"/> 
        <jaxrs:param name="startContact" type="REQUEST_BODY"/> 
       </jaxrs:operation> 
      </jaxrs:resource> 
     </jaxrs:model> 
     <jaxrs:serviceBeans> 

現在,當我點擊公開的服務: enter image description here

我得到以下跟蹤:

HTTP Status 500 - 
________________________________________ 
type Exception report 
message 
description The server encountered an internal error() that prevented it from fulfilling this request. 
exception 
java.lang.RuntimeException: org.apache.cxf.interceptor.Fault 
    org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:102) 
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:315) 
    org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) 
    org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:105) 
    org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461) 
    org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:188) 
    org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) 
root cause 
org.apache.cxf.interceptor.Fault 
    org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:67) 
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:315) 
    org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) 
    org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:105) 
    org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461) 
    org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:188) 
    org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) 
root cause 
java.lang.NullPointerException 
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleOperation(WadlGenerator.java:310) 
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleResource(WadlGenerator.java:253) 
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleRequest(WadlGenerator.java:185) 
    org.apache.cxf.jaxrs.impl.RequestPreprocessor.checkMetadataRequest(RequestPreprocessor.java:189) 
  

我沒有調試到CXF-JAXRS源和在線

java.lang.NullPointerException 
     org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleOperation(WadlGenerator.java:310) 

該方法搜索annotatedMethod,但該對象的annotatedMethod字段爲null,因此會引發錯誤。

我可以使用方法上方的類中的註釋工作。但我希望它通過xml配置工作。

我指定

<jaxrs:operation name="retrieve" path="{partyId}" consumes="application/json" produces="application/json" verb="GET"> 

retrieve被調用運行。還有哪些屬性需要設置指定?或者它只是xml配置的限制? PS:如果您覺得需要添加或澄清更多信息,請發表評論。對於RESTful服務而言並不新鮮,並且不確定在此情況下所有信息的預期情況。

UPDATE:

服務類

//@Path("/startContactBP") 
public class StartContactBP { 
    //@PUT 
    //@Consumes(MediaType.APPLICATION_JSON) 
    //@Produces(MediaType.APPLICATION_JSON) 
    //@Path ("/") 
    //public com.csc.fs.ws.contact.StartContactResult startContact(@Context HttpServletRequest req, com.csc.fs.ws.contact.StartContact startContact){ 
    public com.csc.fs.ws.contact.StartContactResult startContact(HttpServletRequest req, com.csc.fs.ws.contact.StartContact startContact){ 

     //call login 
      //call actual service 
      //call logoff 
    } 

回答

1

從我所看到的CXF不一定預期要進行註釋的方法,WadlGenerator簡單的類OperationResourceInfo這恰好的實例調用的方法稱爲getAnnotatedMethod。這可能是因爲開發人員只是懶惰,並沒有用這種方法進行適當的命名。

我的建議是在堆棧跟蹤中調試較高的值以查看什麼是創建類OperationResourceInfo的實例,從中您應該能夠看到這個創建是否出錯。

此外,您正在使用什麼版本的CXf?確保它是最新的。

出於好奇,沒有任何理由爲什麼你會去XML配置,而不是註解?

+0

naah ..沒有這種使用XML的原因。只有_Requirements_由相信___的建築師產生「如果他可以再放一層,他可以統治世界」___大聲笑:) –

+0

我覺得你的痛苦相信我!雖然我必須承認這是一個真正的笑話來改變一些有效的東西。我不想考慮XML vs Annotations的優點,但是我更喜歡註釋,因爲我可以打開一個類,看看事物如何連接在一起而不必打開一個XML文件... – ramsinb

+0

@Yea我知道,任何開發人員會同意這一點。另外我也更喜歡註釋,但是當「建築師」乘坐航程去統治世界時,你會做什麼;-),無論如何,我將在早上嘗試,並用我的發現來更新這篇文章。謝謝(y) –