10

残りの Web サービスを呼び出すためにジャージー クライアントを使用しています。

私のWebサービスはjsonを消費しているので、jsonをWebサービスプロバイダーへの呼び出しに入れる必要があります。

以下の方法でやっています。

    JSONObject object=new JSONObject();
    object.put("name", employee.getName());
    object.put("empId", employee.getEmpId());
    object.put("organizationName", employee.getOrganizationName());


ClientResponse response = service.path("rest").path("vtn").path("addEmplyee")
            .type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, object);

しかし、私は以下の例外を受けています:

09:52:01,625 エラー [[mvc-dispatcher]] サーブレット mvc-dispatcher の Servlet.service() が例外 com.sun.jersey.api.client.ClientHandlerException をスローしました: Java タイプ、クラス net.sf のメッセージ本文ライター。 json.JSONObject、および MIME メディア タイプの application/json が見つかりませんでした com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:288) で com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:204) で com.sun.jersey.client で.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:147) com.sun.jersey.api.client.Client.handle(Client.java:648) com.sun.jersey.api.client.WebResource.handle(WebResource) .java:670) com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:563) com.nec.jp.pflow.unc.service.EmployeeService.addEmployee(EmployeeService.java:44) で com.nec.jp.pflow.unc.controller.EmployeeController.addCustomer(EmployeeController.java:29) sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

しかし、jsonを次のような文字列表現に変換すると:

String input = "{\"name\" : \"" + employee.getName() + "\",\"empId\" : \"" + employee.getEmpId() + "\",\"organizationName\" : \"" + employee.getOrganizationName() + "\"}";

ClientResponse response = service.path("rest").path("vtn").path("addEmplyee")
            .type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, input);

その後、正常に動作しています。

上記の例外を取得せずに JSON オブジェクトを配置する方法を提案してください。最善の方法は何ですか?

前もって感謝します。


上記の解決策が得られました。今、POJO を json に変換するために jackson-mapper API を使用しています。

以下はコードスニペットです。

ObjectMapper mapper = new ObjectMapper();
ClientResponse response = resource.path("rest").path("vtn").path("addEmplyee")
        .type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, mapper.writeValueAsString(employee)); 
4

7 に答える 7

14

より良い方法は、シリアル 化にjersey-client使用する可能性があることを伝えることです: https://stackoverflow.com/a/2580315/516188jackson

セットアップの貼り付け:

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client clientWithJacksonSerializer = Client.create(cc);

JacksonJsonProviderjackson-jaxrs-json-providerパッケージに入っています。

于 2014-10-15T11:55:30.130 に答える
8

誰かが答えを探している場合に備えて、上記の質問から解決策をコピーするだけです。

以下のコードスニペットに示すように、POJOをjsonに変換するにはjackson-mapperapiを使用します。

ObjectMapper mapper = new ObjectMapper();
ClientResponse response = resource.path("rest").path("vtn").path("addEmplyee")
        .type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, mapper.writeValueAsString(employee)); 
于 2012-11-19T10:28:31.737 に答える
2
JSONObject object=new JSONObject();

注釈を提供する必要があり@XMLrootElementます....リモートからWebサービスにアクセスしている場合....つまり、ModelクラスのXMLマッピング..

于 2013-02-04T05:21:44.710 に答える
1

ここでたくさん読んだ後、私がたどり着いた解決策は次のとおりです。

JERSEY-CLIENT を以下のようにバージョン 1.9 以降で使用している場合

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.9.1</version>
</dependency>

次に、バージョン 2.19 以降の以下に指定されている MOXY Jar を使用します。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.19</version>
</dependency>

次に、以下に示すように、クライアント構成のクラスに MOXyJsonProvider.class を追加します。

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(MOXyJsonProvider.class);
Client client = Client.create(cc);

ここで、クライアント オブジェクトに必要な構成を行い、サーバーに接続してリクエストを実行します。

WebResource webResource = client.resource(*restFulPath*);
Builder builder = webResource.accept(MediaType.APPLICATION_JSON);

builder.header("Content-Type", "application/json");
builder.header("Accept ", "application/json");
builder.accept(MediaType.APPLICATION_JSON);

try
{
    String requestData = "*requestInJson*";
    ClientResponse response = null;
    response = builder.post(ClientResponse.class, requestData);
    if (response.getStatus() == 200)
    {
        MappedJsonReportOut res = response.getEntity(MappedJsonReportOut.class);
    }
}
于 2016-05-07T09:43:26.263 に答える
0

取得するエラーは少し異なりますが、最終的に解決策は私にとってはうまくいきます

   Caused by: com.sun.jersey.api.client.ClientHandlerException: com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class com.siemens.spring.model.User, and MIME media type, application/json, was not found
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
    at com.sun.jersey.api.client.Client.handle(Client.java:648)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:563)
    at com.siemens.controller.UserRegistration.process(UserRegistration.java:156)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)

そして、これは私のために働いたソリューションです:

    Client client = Client.create();
    WebResource webResource = client
            .resource("http://localhost:8080/NewsTickerServices/Siemens/CreateJUser");
    // value added

    ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,mapper.writeValueAsString(user));//user is object of User Pojo class 
于 2014-09-19T14:08:54.687 に答える
0

次のように、entity() メソッドを使用してこれを実現することもできます。

    ClientResponse response = resource.path("rest").path("vtn").path("addEmplyee")
    .entity(employee, MediaType.APPLICATION_JSON_TYPE)
    .post(ClientResponse.class);

また

    ClientResponse response = resource.path("rest").path("vtn").path("addEmplyee")
    .type(MediaType.APPLICATION_JSON_TYPE)
    .entity(employee)
    .post(ClientResponse.class); 
于 2013-03-21T08:50:43.453 に答える