詳細な返信には、 JSON マーシャリングとアンマーシャリングを使用したサーバーとクライアントのサンプル実装が
含まれています
注: Json POJO マッピング機能は、Jackson を使用して行われます
メッセージ本文の書き込みが見つからない理由を見つけるのに丸一日を費やしました。私が間違っていたのはJAXB javax.xml.bind.annotation @XMLRootElement
、Jersey 1.17.1 Web サービスで使用していて、Jackson で非整列化しようとしていたことです。
実際に Google で検索するとJAXB
、XML にのみ有効ですが、JSON には Jackson が優れていることがわかります。web.xml
また、POJO マッピング機能を有効にする構成パラメーターをいくつか入れるのを忘れていました。
これは、Jackson の POJO マッピング機能を有効にするためにサーブレット マッピングをどのようにするかのスナップです。
<!-- 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>
これらの jar ファイルを WEB-INF/libs フォルダーに追加する必要もあります。
- jackson-core-asl-1.9.2.jar
- jackson-mapper-asl-1.9.2.jar
- jackson-xc-1.9.2.jar
- ジャクソン-jaxrs-1.9.2.jar
これは、いくつかのオブジェクトのリストを返す Web サービス メソッドのサンプルです。
@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();
}
クライアント側
次に、クライアント側でこの JSON オブジェクトを同じオブジェクトに変換する方法を説明しますList<T>
。それは面倒です:-)
POJO に変換したサーバーから同じクラスを配置する必要があります。それは同じはずです
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);
}