3

REST (Jersey 1.8) を使用して Web サービスを開発しています。現在、Java クライアントとサーバー間の通信に XML を使用しています。

JSON に変更する必要があります。どうすれば変更できますか? NetBeans から自動生成されたコードがたくさんありますが、何をどのようにすればよいかわかりません。サービスをテストすると、JSON データが表示されます。私ができないのは、私のmain方法でそれを処理することです。 ここに画像の説明を入力

これらは私が従ったチュートリアルです

私のJavaクライアントmainメソッド:

public class SOATestClient {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        PersonJerseyClient client = new PersonJerseyClient();
        ClientResponse response = client.findAll_XML(ClientResponse.class);


        GenericType<List<Person>> genericType = new GenericType<List<Person>>() {
        };
// Returns an ArrayList of Players from the web service
        List<Person> data = new ArrayList<Person>();
        data = (response.getEntity(genericType));
        System.out.println("Retreiving and Displaying Players Details");
        for (Person person : data) {
            System.out.println("FirstName: " + person.getName());
            System.out.println("ID : " + person.getId());
            System.out.println(" Age : " + person.getAge());
        }
        client.close();
    }
}

人ジャージサイレント

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jerseyclients;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;

/**
 * Jersey REST client generated for REST resource:PersonFacadeREST
 * [entity.person]<br>
 *  USAGE:
 * <pre>
 *        PersonJerseyClient client = new PersonJerseyClient();
 *        Object response = client.XXX(...);
 *        // do whatever with response
 *        client.close();
 * </pre>
 *
 * @author rj45
 */
public class PersonJerseyClient {
    private WebResource webResource;
    private Client client;
    private static final String BASE_URI = "http://localhost:8080/SOATestService/resources";

    public PersonJerseyClient() {
        com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig();
        client = Client.create(config);
        webResource = client.resource(BASE_URI).path("entity.person");
    }

    public void remove(String id) throws UniformInterfaceException {
        webResource.path(java.text.MessageFormat.format("{0}", new Object[]{id})).delete();
    }

    public String countREST() throws UniformInterfaceException {
        WebResource resource = webResource;
        resource = resource.path("count");
        return resource.accept(javax.ws.rs.core.MediaType.TEXT_PLAIN).get(String.class);
    }

    public <T> T findAll_XML(Class<T> responseType) throws UniformInterfaceException {
        WebResource resource = webResource;
        return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
    }

    public <T> T findAll_JSON(Class<T> responseType) throws UniformInterfaceException {
        WebResource resource = webResource;
        return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
    }

    public void edit_XML(Object requestEntity) throws UniformInterfaceException {
        webResource.type(javax.ws.rs.core.MediaType.APPLICATION_XML).put(requestEntity);
    }

    public void edit_JSON(Object requestEntity) throws UniformInterfaceException {
        webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).put(requestEntity);
    }

    public void create_XML(Object requestEntity) throws UniformInterfaceException {
        webResource.type(javax.ws.rs.core.MediaType.APPLICATION_XML).post(requestEntity);
    }

    public void create_JSON(Object requestEntity) throws UniformInterfaceException {
        webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).post(requestEntity);
    }

    public <T> T findRange_XML(Class<T> responseType, String from, String to) throws UniformInterfaceException {
        WebResource resource = webResource;
        resource = resource.path(java.text.MessageFormat.format("{0}/{1}", new Object[]{from, to}));
        return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
    }

    public <T> T findRange_JSON(Class<T> responseType, String from, String to) throws UniformInterfaceException {
        WebResource resource = webResource;
        resource = resource.path(java.text.MessageFormat.format("{0}/{1}", new Object[]{from, to}));
        return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
    }

    public <T> T find_XML(Class<T> responseType, String id) throws UniformInterfaceException {
        WebResource resource = webResource;
        resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{id}));
        return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
    }

    public <T> T find_JSON(Class<T> responseType, String id) throws UniformInterfaceException {
        WebResource resource = webResource;
        resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{id}));
        return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
    }

    public void close() {
        client.destroy();
    }

}

以下でアクセスしてみると、XMLと同じように扱えますが、

ClientResponse response = client.findAll_JSON(ClientResponse.class);

しかし、それは私に与えます

Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
 - with linked exception:
[com.sun.istack.internal.SAXParseException2; lineNumber: 0; columnNumber: 0; unexpected element (uri:"", local:"id"). Expected elements are <{}person>]
    at com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.readFrom(AbstractListElementProvider.java:251)
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553)
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:523)
    at soatestclient.SOATestClient.main(SOATestClient.java:33)
Caused by: javax.xml.bind.UnmarshalException

この件についてお役に立てれば幸いです。ありがとうございました!

4

3 に答える 3

5

私は同じ質問を解決しました。あなたの例外が次の場合:unexpected element (uri:"", local:"id")........

次のコードを追加することを忘れないでください:

    DefaultClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
    Client client = Client.create(clientConfig);

次にコード:

return resource.type(MediaType.APPLICATION_JSON_TYPE).get(new GenericType<List<MyClass>>(){});

大丈夫だろう。

于 2012-08-23T06:45:59.100 に答える
2

1) このエラーを生成している人は誰でも、明らかに XML 入力を期待しています。JSON ではありません。できるだけ早く変更する必要があります。

 javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
 com.sun.istack.internal.SAXParseException2;
 <= javax.xml.bind and SAXParse are both XML-only: JSON not invited

2) スクリーン ショットの内容 (おそらくジャージー?) は間違いなく問題ありません。

3) 私はチュートリアル全体に従っていませんでした。

提案:

チュートリアルのステップをたどって、すべてのステップで「JSON」( XML やSOAPではない)を選択していることを確認してください。

=========== 補遺 ===========

OK - 更新していただきありがとうございます。ここに私たちがいるところです:

1)これが問題です:

Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
 - with linked exception:
[com.sun.istack.internal.SAXParseException2; lineNumber: 0; columnNumber: 0; unexpected element (uri:"", local:"id"). Expected elements are <{}person>]
    at com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.readFrom(AbstractListElementProvider.java:251)
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553)
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:523)
    at soatestclient.SOATestClient.main(SOATestClient.java:33)
Caused by: javax.xml.bind.UnmarshalException

2) あなたは、このスタック トレースバックがクライアントから来ていると言いました。

したがって、サーバーは 100% OK ですあとはクライアントを修正するだけです。涼しい :)

3) トレースバックは、クライアントが XML を予期していることを示していますが、代わりに JSON を取得しています。

したがって、修正する必要がある唯一のことは、クライアントに「ねえ、XML ではなく JSON を読んでください」と伝えることです再び-クール:)

4) どうやってそれをしますか?

まず、この行を削除する必要があります (まだ削除していない場合)。

// Bad, bad bad.  Don't do this!|
ClientResponse response = client.findAll_XML(ClientResponse.class);

5) クライアント コードの他の部分を変更する必要があるかもしれませんが、わかりません。

クライアントの構成も変更したいかもしれません-それもわかりません。

6) 提案: この他のチュートリアルを見てください - それはあなたを正しい方向に向けるかもしれません:

ノート:

あなたがする必要があることは何でも - それは本当に簡単でなければなりません! リンクを確認し、コードとテスト クライアントの構成を確認してください。見つけたものを投稿してください。

前もって感謝します...

于 2012-07-08T03:37:52.957 に答える