/ / Jersey 1.17.1 POJO Mapping Feature Server und wie komme ich vom Client? - json, jersey, jackson, pojo, jersey-client

Jersey 1.17.1 POJO Mapping Feature Server und wie komme ich vom Client? - json, jersey, jackson, pojo, jersey-client

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 № 1

Detaillierte 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>