1

サーバーで REST サービスを実行しており、POJO のリストを Json に変換したいと考えています。@XMLRootElement JA-RX は XML にのみ適しているため、使用したくありません。Google で検索すると、Json には Jackson が非常に適していることがわかります。

この問題を解決した人はいますか?完全なサーバーとクライアント コードを貼り付けてください。

注: 私はこれを行う方法を見つけるのに 16 時間を費やしました。質問に答えたときに回答が削除されたので、他の人の貴重な時間を節約するためにこれをここに置くことにしました。私は知識の共有を信じています.コード。私はいつでも提案を受け付けています。

4

2 に答える 2

12

詳細な返信には、 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);   

    }
于 2013-09-06T06:44:56.757 に答える
3

Jersey のこれには、上記のすべての JAR が含まれています。

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>${version.jersey}</version>
    <scope>runtime</scope>
</dependency>
于 2013-10-30T19:06:17.577 に答える