Ich führe einen REST-Dienst auf dem Server aus und möchtemeine POJO-Liste in Json umwandeln. Ich möchte @XMLRootElement JA-RX nicht verwenden, da es nur für XML geeignet ist. Wenn Sie Google verwenden, werden Sie feststellen, dass Jackson eine sehr gute Wahl für Json ist.
Gibt es jemanden, der dieses Problem gelöst hat und fügen Sie bitte den vollständigen Server- und Client-Code ein?
Hinweis: Ich habe 16 Stunden damit verbracht, herauszufinden, wie das geht, und als ich auf Fragen geantwortet habe, haben sie meine Antwort gelöscht. Deshalb habe ich beschlossen, dies hier zu platzieren, um anderen wertvolle Zeit zu sparen, und ich glaube an das Teilen von Wissen. Bitte, wenn Sie meinen Code verbessern können. Ich bin immer offen für Vorschläge.
Antworten:
11 für die Antwort № 1Detaillierte Antwort enthält Server und Klient Beispielimplementierung mit JSON Marshalling und Unmarshalling
Hinweis: Json POJO Mapping-Funktionen werden mit Jackson ausgeführt
Ich verbrachte einen ganzen Tag damit, herauszufinden, warum das Schreiben eines Nachrichtentexts nicht gefunden wurde. Was ich falsch gemacht habe ist, dass ich verwendet habe JAXB javax.xml.bind.annotation @XMLRootElement
in meinem Jersey 1.17.1 Web Service und ich habe versucht, es mit Jackson zu entfernen.
Wenn Sie es googeln, werden Sie es tatsächlich finden JAXB
ist nur für XML gut, aber für JSON ist Jackson ausgezeichnet. Ich habe auch vergessen, ein paar Konfigurationsparameter in meine zu setzen web.xml
die die POJO-Mapping-Funktion aktivieren.
Hier sehen Sie, wie Ihre Servlet-Zuordnung aussehen sollte, um die POJO-Zuordnungsfunktion von Jackson zu aktivieren.
<!-- WebService -->
<servlet>
<servlet-name>REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.LoggingFilter;com.algo.server.webservice.WebServiceRequestFilter</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.algo.server.webservice;org.codehaus.jackson.jaxrs</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Sie müssen diese JAR-Dateien auch Ihrem WEB-INF / libs-Ordner hinzufügen
- jackson-core-asl-1.9.2.jar
- jackson-mapper-asl-1.9.2.jar
- jackson-xc-1.9.2.jar
- jackson-jaxrs-1.9.2.jar
Dies ist eine Beispiel-Webdienstmethode, die eine Liste einiger Objekte zurückgibt
@GET
@Produces({ MediaType.APPLICATION_JSON })
@Path("/clientId/{client_id}/clientDept/{client_department}/clientLoc/{client_location}")
public Response getTasksForClientId(@PathParam("client_id") String pClientId,
@PathParam("client_department") String pClientDepartment,
@PathParam("client_location") String pClientLocation) {
List<Task> list = new ArrayList<Task>(10);
Task task = null;
for (int i = 0; i < 10; i++) {
task = new Task();
task.setComments("These are test comments");
task.setCreatedBy(11L);
task.setCreatedOn(new Date());
task.setFromDay(new Date());
task.setFromTime(new Date());
task.setToTime(new Date());
task.setToDay(new Date());
task.setUpdatedOn(new Date());
task.setLocation("Pakistan Punajb");
task.setSpecialCoverImage("webserver\cover\cover001.png");
task.setTargetId(1L);
task.setTargetPlaceHolder(2);
task.setUpdatedBy(23234L);
list.add(task);
}
GenericEntity<List<Task>> entity = new GenericEntity<List<Task>>(list) {
};
return Response.ok(entity).build();
}
Clientseite
So verwenden Sie konvertieren dieses JSON-Objekt auf der Clientseite in dasselbe List<T>
Objekt. Es ist eine Sünde :-)
Sie müssen dieselbe Klasse auf dem Server ablegen, den Sie in POJO konvertiert haben. Es sollte dasselbe sein
private void checkForUpdate() {
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
clientConfig.getClasses().add(JacksonJsonProvider.class);
Client client = Client.create(clientConfig);
WebResource webResource = client.resource("http://localhost:8080/some-server");
WebResource wr = webResource.path("rest").path("taskPublisherService").path("clientId/12").path("clientDept/2").path("clientLoc/USA");
ClientResponse clientResponse = wr.type(MediaType.APPLICATION_JSON).get(ClientResponse.class);
List<Task> lists = clientResponse.getEntity(new GenericType<List<Task>>() {});
System.out.println(lists);
}
3 für die Antwort № 2
Diese aus Jersey enthält alle oben genannten JARs:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>${version.jersey}</version>
<scope>runtime</scope>
</dependency>