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.
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 –
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 –
http: // codingexplained .com/coding/java/ignorierend-unerkannt-json-fields-feder-jackson –