Получение JSON из спокойного java-клиента

Я разрабатываю веб-сервис с использованием REST (Джерси 1.8). В настоящее время я использую XML для связи между клиентом Java и сервером.

Мне нужно изменить его на 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

Я был бы признателен, если бы вы могли помочь мне в этом вопросе. Спасибо!


person Ruwantha    schedule 08.07.2012    source источник


Ответы (3)


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) на каждом этапе путь.

=========== ДОПОЛНЕНИЕ ===========

ОК - Спасибо за обновление. Вот где мы находимся:

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 % в порядке. ЕДИНСТВЕННАЯ вещь, которую вам нужно сделать, это починить ваш клиент. Прохладный :)

3) Трассировка показывает, что клиент ожидает XML... но вместо этого получает JSON.

Таким образом, ЕДИНСТВЕННАЯ вещь, которую вам нужно исправить, это сказать вашему клиенту: "Эй, читай JSON, а не XML". Опять же - круто :)

4) Как ты это делаешь?

Ну, для начала вам нужно избавиться от этой строки (если вы еще этого не сделали):

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

5) Возможно, вы захотите изменить другие части вашего клиентского кода - я не знаю.

Вы также можете изменить конфигурацию вашего клиента - я тоже этого не знаю.

6) Предложение: посмотрите этот другой учебник - он может указать вам правильное направление:

ЗАМЕТКА:

ЧТО вам нужно сделать — это должно быть ДЕЙСТВИТЕЛЬНО просто! Пожалуйста, просмотрите ссылку, проверьте свой код и конфигурацию тестового клиента... и опубликуйте, что вы найдете!

Заранее спасибо...

person paulsm4    schedule 08.07.2012
comment
Нет, на самом деле учебник в порядке (работает). Там они используют xml. Но вместо этого мне нужно использовать JSON. Это все. - person Ruwantha; 08.07.2012
comment
@ RJ45 - обратная трассировка ясно показывает, что он ПОЛУЧАЕТ Json, но ОЖИДАЕТ XML. Это проблема, которую вам нужно исправить. В: Где именно происходит трассировка стека: ваш клиент или ваш сервер? Это парень, которого тебе нужно исправить. В: Что на скриншоте: ваш клиент или ваш сервер? Он определенно (отправляет? Получает?) Json. - person paulsm4; 08.07.2012
comment
-Ошибка появляется при запуске клиента. -скриншот сделан с сервера(по нажатию test restful service). Я могу отправлять или получать с помощью xml, но не с помощью JSON. - person Ruwantha; 08.07.2012
comment
@ RJ45 - Пожалуйста, прочитайте мое дополнение выше ... и, пожалуйста, дайте нам знать, если оно работает! Удачи! - person paulsm4; 09.07.2012
comment
да. ты прав. Это простое изменение. Я только что изменил ответ ClientResponse = client.findAll_XML(ClientResponse.class); в ответ ClientResponse = client.findAll_JSON (ClientResponse.class); и получить к нему доступ с помощью response.getEntity(String.class). Это все. Спасибо! - person Ruwantha; 09.07.2012

я решил тот же вопрос. если ваше исключение: неожиданный элемент (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>>(){});

будет в порядке.

person steven    schedule 23.08.2012
comment
Мне пришлось перейти на php-клиент вместо java. Но это может помочь кому-то. Спасибо :) - person Ruwantha; 24.08.2012
comment
очень прекрасный ответ для моего случая, сэкономьте мое время, спасибо :) - person Agung Setiawan; 28.11.2013
comment
Это было очень полезно. Мне не приходило в голову, что он может пытаться прочитать его как XML, когда я уже написал accept(MediaType.APPLICATION_JSON_TYPE). - person Daniel Kaplan; 30.01.2014

http://smoothexample.com/webservices/apache_cxf_rest_web_services_client.html

В приведенном выше примере дается пример клиентского приложения, использующего apache cxf, здесь клиент может использовать как xml, так и json, предоставляя заголовок «Accept».

Также здесь доступен простой пример для веб-службы отдыха cxf, который даже возвращает как xml, так и json на основе заголовка «Accept».

person user902997    schedule 26.10.2016