Glassfish: MessageBodyProviderNotFoundException в клиенте Jersy

Привет всем, я пытался создать веб-сервис для отдыха с нуля. Вот моя сервисная часть

@Path("/Phones")
public class PhonessResource {

 @GET
 @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
  public Response getAllNumbers(){
      List<PhoneDetail> list = PhoneDirectoryDao.getInstance().getAllNumbers();
      GenericEntity<List<PhoneDetail>> entity = new GenericEntity<List<PhoneDetail>>(list) {};
      Response response =Response.ok(entity).status(200).build();
      return response;//PhoneDirectoryDao.getInstance().getAllNumbers();
    }
 }

Моя модель данных: у меня были геттеры и сеттеры вместе с другим конструктором, который принимает все свойства, я не вставлял его, чтобы уменьшить длину вопроса, я использую одну и ту же модель данных в клиенте и сервере

@XmlRootElement(name="PhoneDetail")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"id","firstName","lastName","address","phoneNo","timeStamp"})
public class PhoneDetail {

    private int id;
    private String firstName;
    private String lastName;
    private String address;
    private String phoneNo;
    private Timestamp timeStamp;

    public PhoneDetail() {}
}

Затем я создаю java-клиент для тестирования службы. Я использую NETBEANS IDE, поэтому я выбираю параметр по умолчанию в IDE для его создания.

введите здесь описание изображения

Таким образом, я создаю клиент Джерси

public class PhoneCLient {
    private WebTarget webTarget;
    private Client client;
    private static final String BASE_URI = "http://localhost:8080/Phones/webresources";

    public PhoneCLient() {
        client = javax.ws.rs.client.ClientBuilder.newClient();
        webTarget = client.target(BASE_URI).path("Items");
    }


    public <T> T getAllNumbers_XML(Class<T> responseType) throws ClientErrorException {
        WebTarget resource = webTarget;
        return resource.request(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
    }

    public <T> T getAllNumbers_JSON(Class<T> responseType) throws ClientErrorException {
        WebTarget resource = webTarget;
        return resource.request(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
    }
}

Но это дает мне эту ошибку

Exception in thread "main" org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/xml, type=class org.glassfish.jersey.client.ClientResponse, genericType=class org.glassfish.jersey.client.ClientResponse.
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:173)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:134)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:988)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:833)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:768)
    at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:96)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:740)
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:88)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:650)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:421)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:646)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:375)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:275)
    at PhoneDirectoryClient.rest.PhoneCLient.getAllNumbers_XML(PhoneCLient.java:45)

Но когда я тестирую службу в браузере или плагине RestClient Browser, она работает нормально. Кто-нибудь может сказать мне, что пошло не так??


person edwin    schedule 15.11.2014    source источник


Ответы (1)


Для Xml, если у вас есть все зависимости, которые поставляются с Джерси, это должно сработать для клиентского API. Возможно, вы добавили не все из них. Я вижу, вы не используете Maven, что я бы настоятельно советовал делать. Но я предоставлю оба способа справиться с этим.

XML

Мейвен:

Только зависимости, которые вам понадобятся для запуска клиента (с поддержкой JAXB xml)

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.13</version>
</dependency>

проще не бывает :-)

Неспециалисты:

Поэтому, используя проект Maven, я добавил вышеуказанную зависимость, и это все транзитивные зависимости, которые она извлекла. В вашем проекте, отличном от Maven, вам нужно будет вручную добавить все эти jar-файлы.

введите здесь описание изображения

Если вы перейдете на домашнюю страницу Джерси, перейдите в раздел "Загрузки" и загрузите файл Jersey JAX-RS 2.0 RI bundle. Вы должны найти все эти зависимости там. Вы должны добавить все необходимые в свой проект

Примечание. Netbeans уже поставляется с библиотекой Jersey 2.0 (JAX-RS RI). Вместо этого вы можете просто добавить эту библиотеку в свой проект. Просто щелкните правой кнопкой мыши узел [Библиотеки] в вашем проекте и выберите [Добавить библиотеку]. Вы должны увидеть Джерси в диалоговом окне. Это решение, вероятно, самое простое, но оно будет импортировать все зависимости Джерси больше, чем требуется для клиентского API.

JSON

JSON требует другой зависимости:

Мейвен:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-jackson</artifactId>
    <version>2.13</version>
</dependency>

Неспециалисты

Взгляните на этот пост, чтобы найти изображение и дополнительные пояснения.


Просто наличие этих зависимостей в пути к классам должно работать без какой-либо специальной настройки.

ОБНОВИТЬ

В более новых версиях клиента Jersey jersey-media-jaxb больше не используется, и вам нужно будет добавить его вручную для поддержки XML/JAXB.

person Paul Samsotha    schedule 15.11.2014
comment
На самом деле все эти банки присутствовали в моем Java-клиенте. На самом деле я просто пишу код вручную для клиента без использования встроенных функций Netbeans, он начинает работать. Спасибо за ваш совет Maven и json - person edwin; 16.11.2014