2012-11-21 14 views
10

私たちはクラスからすべてのアノテーションを取り出し、spring-config.xmlで設定しようとしています。 enter image description hereREST services:アノテーションを使用しないでannotatedMethodを指定する方法

私は次のトレースを取得:

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にデバッグなかった

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> 

のように見えますソースおよびライン

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

このメソッドはannotatedMethodを検索しますが、オブジェクトにはnullというannotatedMethodというフィールドがあり、エラーがスローされます。

私はメソッドの上のクラスのアノテーションを使用して動作させることができます。しかし、私はそれがxmlの設定を介して動作します。

私はretrieveと呼ばれる操作である

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

を指定しています。他の属性を設定する必要があるのは何ですか?それとも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と呼ばれます。これは、開発者がちょうど怠け者であり、メソッドの名前をapprioriatelyしていないためです。

私の提案は、スタックトレースの中でデバッグして、クラスOperationResourceInfoのインスタンスを作成しているかどうかを確認することです。この作成が間違っているかどうかを確認できるはずです。

さらに、どのバージョンのCXfを使用していますか?最新のものを確認してください。

注釈とは対照的にXML設定を行う理由は何ですか?

+0

naah .. xmlを使用する理由はありません。ただ信じる建築家によって生成されたただ_必要なもの___ "もし彼がもう一つの層を置くことができれば、彼は世界を支配することができます" ___笑:) –

+0

私はあなたの痛みが私を信じると感じます!私はそれが動作するものを変更するための本当の冗談であることを認めなければならないが。私はXML対アノテーションのメリットに迷いたくはありませんが、私はクラスを開き、XMLファイルを開く必要なしに物事が一緒にどのようにつながっているかを見ることができるので、アノテーションを好むのです。 – ramsinb

+0

@Yea私は知っています開発者はそれに同意するだろう。また、私はアノテーションも好きですが、 "Architect"が世界を支配する___Voyage上にいるときはどうしますか?とにかく、私は朝にそれを試してみて、私の所見を更新します。ありがとう(y) –

関連する問題