2012-11-21 2 views
10

우리 클래스의 모든 주석을 제거하고 spring-config.xml으로 구성하려고합니다.REST services : 주석을 사용하지 않고 annotatedMethod를 지정하는 방법

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

난 다음 추적을 얻을 : 나는 CXF-jaxrs에 디버그를했다

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) 
  

소스 및 라인

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 구성의 제한 사항입니까?

추신 : 더 많은 정보를 추가하거나 정리해야한다고 생각되면 의견을 남기십시오. RESTful 서비스를 처음 접하고이 컨텍스트에서 모든 정보가 무엇인지 예상하지 못한다.

UPDATE :

서비스 클래스

내가 WadlGenerator 단순히 발생 클래스 OperationResourceInfo의 인스턴스의 메소드를 호출하고, CXF는 반드시 방법은 주석이 될 것으로 예상되지 볼 수있는에서
//@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

getAnnotatedMethod이라고합니다. 이것은 개발자가 게으르다가 apprioriately 방법을 지명하지 않았기 때문일 수 있습니다.

제 제안은 스택 트레이스에서 더 높은 디버깅을하여 OperationResourceInfo 클래스의 인스턴스를 만드는 것입니다. 그러면이 생성이 잘못되었는지 알 수 있습니다.

또한 CXf의 어떤 버전을 사용하고 있습니까? 최신 버전을 확인하십시오.

왜 주석을 사용하지 않고 XML 구성을 사용하게 될지 궁금한 점이 있습니까?

+0

naah .. xml을 사용하는 그러한 이유가 없습니다. 믿을만한 건축가가 만든 _Requirements_ ___ "만약 그가 단 하나의 층을 더 넣을 수 있다면 그는 세상을 통치 할 수 있습니다"___ lol :) –

+0

나는 당신의 고통이 나를 믿는다고 느낍니다! 나는 그것이 작동하는 무언가를 바꾸는 것이 진짜 농담이라는 것을 인정해야하지만. 나는 XML 대 Annotations의 장점을 얻고 싶지 않지만 XML 파일을 열지 않아도 클래스가 열리고 물건들이 함께 연결되어있는 것을 볼 수 있다면 주석을 선호한다. – ramsinb

+0

@ 예, 알고 있습니다. 개발자는 그것에 동의 할 것입니다.또한 나는 주석을 선호하지만 "Architect"가 세계를 통치하기위한 ___ 여행객에있을 때 당신은 무엇을합니까? 어쨌든, 나는 아침에 그것을 시도하고 나의 발견으로 게시물을 업데이트 할 것입니다. 감사합니다 (y) –

관련 문제