2016-04-29 5 views
0

Ich habe ein POJOJSON Jersey Auto Serialisierung Wrapper Probleme

public class Graph { 
    public int v; 
    public int e; 
} 

und eine sehr einfache Service

@Service("graph-service#default") 
public class DefaultGraphService implements GraphService { 
    public Response createGraph(Graph graph) { 
     return Response.ok().build(); 
    } 
} 

, die eine sehr einfache Schnittstelle

@Path("graph-service") 
public interface GraphService { 

    @Path("create-graph") 
    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response createGraph(Graph graph); 
} 

ich eine einfache Feder haben implementiert -context.xml wie folgt eingerichtet

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://cxf.apache.org/jaxrs 
     http://cxf.apache.org/schemas/jaxrs.xsd"> 

    <import resource="classpath:META-INF/cxf/cxf.xml"/> 
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> 

    <context:annotation-config/> 
    <context:component-scan base-package="me.jamesphiliprobinson.graphs"/> 

    <jaxrs:server id="testServices" address="/testServices"> 
     <jaxrs:serviceBeans> 
      <ref bean="graph-service#default"/> 
     </jaxrs:serviceBeans> 
     <jaxrs:providers> 
      <ref bean="jsonProvider"/> 
     </jaxrs:providers> 
    </jaxrs:server> 
    <bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" /> 
</beans> 

Wenn ich den Dienst bis in tomcat Spin funktioniert es gut kann ich ein Objekt wie

{"v":2,"e":1} 

ohne Schwierigkeiten locken können. Allerdings, wenn ich diesen Test laufen

@Test 
public void testCreateGraph() { 
    UncertaintyGraphService service = 
      JAXRSClientFactory.create("http://localhost:" + port + "/" + getRestServicesPath() + "/testServices/", 
             GraphService.class); 
    Graph graph = new Graph(); 
    graph.e = 1; 
    graph.v = 2; 
    Response result = service.createGraph(graph); 
    assertNotNull(result); 
} 

Dann scheitert es, da es

No message body writer has been found for class : class me.jamesphiliprobinson.graphs.Graph, ContentType : application/json 

ist Wenn ich ein

@XmlRootElement 

zum POJO fügen Sie dann der Dienst das Diagrammobjekt serialisiert aber scheint senden

{"graph":{"e":1,"v",2}} 

Statt welche kann ich sehen, Sinn machen, aber die Deserialisierung scheint noch

{"e":1,"v":2} 

zu erwarten, wie ich den Fehler bekommen

WARNING: WebApplicationException has been caught : Unrecognized field "graph" (Class me.jamesphiliprobinson.graphs.Graph), not marked as ignorable 

Ich bin sicher etwas unglaublich einfach fehlt. Ich würde es vorziehen, für die Einzelteile zu

{"v":2,"e":1} 

serialise Aber wenn sie deserialise korrekt kann ich mit einem Wurzelelement leben. d. h.

+1

Versuchen Sie, die überlastet [ 'JAXRSClientFactory.create (String baseaddress, Klasse cls, List Anbieter)'] zu verwenden (https://cxf.apache.org/javadoc/latest/org/apache/cxf/Jaxrs/Client/JAXRSClientFactory.html # create% 28java.lang.String,% 20java.lang.Class,% 20java.util.List% 290), und fügen Sie den 'JacksonJsonProvider' zur' Liste' der Provider hinzu –

+0

Ich bin nicht 100% sicher, (brauche etwas Forschung), aber ich kann Ihnen ein paar Hinweise geben. Es scheint, dass Sie Jackson zusammen mit gebürtigem JAXB mischen. Meine Gedanken über tomcat den Kontext laden mit JsonProvider und parsen entsprechend. Aber im Test wird es vielleicht nicht jsonProvider bekommen, vielleicht braucht es eine andere Konfiguration für den Testkontext. Wenn Sie also @XmlRootElement verwenden, wird es gemäß JAXB produziert. Es gibt ein bisschen Unterschied zwischen denen http://stackoverflow.com/questions/28895761/jackson-vs-jaxb-what-is-better-for-json?answertab=active#tab-top –

+0

http: // codingexplained .com/coding/java/ignorierend-unerkannt-json-fields-feder-jackson –

Antwort

1

Sehen Sie, wo Sie die JacksonJsonProvider auf dem Server registrieren?

Dies ist JSON (De) Serizalisierung zu/von POJO auf der Serverseite zu behandeln. Aber der Kunde benötigt die gleiche Unterstützung. Sie können die überladenen

verwenden, um die Provider auf der Client-Seite zu registrieren. Fügen Sie einfach JacksonJsonProvider zu List von providers hinzu.

JAXRSClientFactory.create(baseUri, Service.class, Arrays.asList(new JacksonJsonProvider())