2013-04-09 4 views
6

CXF + JacksonをJaxB @ XmlRootElementアノテーションとともに使用してRESTサービスの簡単な例を設定しようとしています。私はすでに、様々な同様のスタックオーバーフローで質問だけでなく、thisのようなブログを介して行っており、以下の解決策が出ている次のようにカスタムオブジェクトマッパーを作成しJacksonがObject Mapperを追加した後でもJAXBアノテーションを検出できない

この合格

public class CustomObjectMapper extends ObjectMapper{ 

    public CustomObjectMapper() { 
    super(); 
    super.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true); 
    super.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); 
    AnnotationIntrospector primary = new JaxbAnnotationIntrospector(); 
    AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); 
    AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary); 
    super.setAnnotationIntrospector(pair); 
    } 

} 

春のconfigにJSONの提供コンストラクタに

<bean id="jacksonMapper" class="com.myorg.test.CustomObjectMapper" /> 

    <jaxrs:providers> 
     <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"> 
      <constructor-arg ref="jacksonMapper" /> 
     </bean> 
    </jaxrs:providers> 

は、単純なクラスを追加しました私は以下のJSON、

{ 
    "JsonBean": { 
     "val1": "Hello", 
     "val2": "Hi" 
    } 
} 

を渡すとJAXBルート要素注釈付き

@XmlRootElement(name = "JsonBean") 
public class JsonBean { 
    private String val1; 
    private String val2; 

    public String getVal1() { 
     return val1; 
    } 

    public void setVal1(String val1) { 
     this.val1 = val1; 
    } 

    public String getVal2() { 
     return val2; 
    } 

    public void setVal2(String val2) { 
     this.val2 = val2; 
    } 

} 

それは例外の下に投げ:

WARNING: javax.ws.rs.InternalServerErrorException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "JsonBean" (Class com.cognizan 
t.poc.connectedcar.JsonBean), not marked as ignorable 
at [Source: [email protected]; line: 2, column: 13] (through reference chain: com.myorg.test.Json 
Bean["JsonBean"]) 
     at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:243) 
     at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:99) 
     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271) 
     at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
     at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239) 
     at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223) 
     at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203) 
     at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137) 
     at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158) 
     at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243) 
     at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:163) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:755) 
     at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219) 
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) 
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457) 
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) 
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) 
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) 
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) 
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) 
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) 
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) 
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255) 
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) 
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
     at org.eclipse.jetty.server.Server.handle(Server.java:368) 
     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) 
     at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:953) 

私はここで何かが足りないのですか?助けてください。

答えて

2

私はそれが正しいです。

私は、カスタムマッパーでのデシリアライズのためのアンラップを追加するために逃した:

は、またCustomObjectMaller

super.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true); 

に以下の行を追加したように、ばねの設定ファイルを変更:

<jaxrs:providers> 
    <bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"> 
     <property name="mapper" ref="jacksonMapper" /> 
    </bean> 
</jaxrs:providers> 

期待どおりに動作するようになりました。

関連する問題