2013-04-09 10 views
6

Sto tentando di configurare un semplice esempio per il servizio REST utilizzando CXF + Jackson con annotazione JaxB @XmlRootElement. Ho già passato attraverso varie domande simili in overflow dello stack così come i blog come this e sono venuto con la soluzione qui di seguito:Jackson non riesce a rilevare l'annotazione JAXB anche dopo aver aggiunto l'Object Mapper

Creato un mapper oggetto personalizzato come segue:

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); 
    } 

} 

superato questo al costruttore di JSON fornito in config primavera

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

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

Aggiunto una semplice classe JsonBean con JAXB Root elemento annotation

@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; 
    } 

} 

Quando passo il JSON qui sotto,

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

è gettando sotto eccezione:

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) 

mi manca qualcosa qui? Per favore aiuto.

risposta

2

Ho capito bene.

ho mancato di aggiungere unwrap per de-serializzazione nel mapper personalizzato:

aggiunta la seguente riga nel CustomObjectMaller

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

anche, modificato il file di configurazione di primavera come:

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

Ha iniziato a funzionare come previsto ..

Problemi correlati