Http 204 ошибка в веб-службе REST (Джерси) - PullRequest
0 голосов
/ 07 февраля 2011

Я использую Джерси / Java для разработки моих REST-сервисов.Мне нужно вернуть XML-представление для моего CarStore:

 @XmlRootElement
public class CarStore {
 private List<Car> cars;

 public List<Car> getCars() {
  return cars;
 }
 public void setCars(List<Car> cars) {
  this.cars = cars;
 }

Вот мой объект Car:

@XmlRootElement
> public class Car {
 private String carName;
 private Specs carSpecs;
 private Category carCategory;
 public String getCarName() {
  return carName;
 }
 public void setCarName(String carName) {
  this.carName = carName;
 }
 public Specs getCarSpecs() {
  return carSpecs;
 }
 public void setCarSpecs(Specs carSpecs) {
  this.carSpecs = carSpecs;
 }
 public Category getCarCategory() {
  return carCategory;
 }
 public void setCarCategory(Category carCategory) {
  this.carCategory = carCategory;
 }

}

Спецификации и Категория перечислены следующим образом:

    @XmlRootElement
> public enum Category {

 SEDANS, COMPACTS, WAGONS, HATCH_HYBRIDS, SUVS, CONVERTIBLES, COMPARABLE;
}

Мой класс ресурсов:

    @GET
 @Produces({MediaType.APPLICATION_XML})
 public CarStore getCars()
 {
    return CarStoreModel.instance.getAllCars();
 }

Мой клиент-джерси:

WebResource service = client.resource(getBaseURI());
System.out.println(service.path("rest").path("cars").accept(
MediaType.APPLICATION_XML).get(String.class));

Я получаю сообщение об ошибке Http 204 при доступе вместе с исключением клиента:

com.sun.jersey.api.client.UniformInterfaceException

Есть идеи?Спасибо !

РЕДАКТИРОВАТЬ: я еще не разработал класс модели ... Я просто инициализировал некоторые автомобильные объекты как фиктивные данные и поместил их в автомобильный магазин.Показывать все классы здесь было бы очень неуклюже.Кстати, прошу прощения за ошибку 204 ... просто я получаю исключение, которое заставило меня так думать.

Ответы [ 6 ]

3 голосов
/ 07 февраля 2011

Я предполагаю, что исключение не связано с кодом ответа (204), потому что 204 является условием успеха, которое указывает «Нет содержимого».

0 голосов
/ 29 мая 2013

Кажется, в Джерси есть жестко закодированная проверка, чтобы генерировать исключение UniformInterfaceException при возвращении HTTP 204.

Лучшим решением будет «исправить» оставшийся сервер, чтобы он никогда не возвращал ноль. например вернуть пустой список или класс с ненулевыми значениями.

В противном случае вам нужно будет поймать UniformInterfaceException, который действительно ужасен

    if (getStatus() == 204) {
        throw new UniformInterfaceException(this);
    }

Больше информации здесь: http://grepcode.com/file/repo1.maven.org/maven2/com.sun.jersey/jersey-client/1.17.1/com/sun/jersey/api/client/ClientResponse.java#ClientResponse.getEntity%28java.lang.Class%2Cjava.lang.reflect.Type%29

0 голосов
/ 30 декабря 2012

Разве вы не пропустили аннотацию @Path в своем классе ресурсов?

@GET
@Path("cars")
@Produces({ MediaType.APPLICATION_XML })
public CarStore getCars() {
   return CarStoreModel.instance.getAllCars();
}

Проверьте, является ли URL-адрес, на котором смонтирован ваш REST WS, тем, который вы ожидаете, поместив точку останова в getCars ()метод (или помещение System.out.println), чтобы убедиться, что он действительно вызывается.

0 голосов
/ 10 апреля 2012

Я полагаю, что вы получаете UniformInterfaceException, потому что ваша функция getCars() не возвращает тело ответа HTTP. Основная проблема заключается в том, что JAXB не преобразует ваш список автомобилей в XML, поскольку в нем отсутствует аннотация @XmlElement.

Ваша функция getCars () должна быть:

@GET
@Produces(MediaType.APPLICATION_XML)
public CarStore getCars() {
    // myCarStore is an instance of CarStore        
    return myCarStore.getCars();
}

и ваш список автомобилей в CarStore должен быть определен:

@XmlElement(name="car")
private List<Car> cars;
0 голосов
/ 07 февраля 2011

В вашем клиентском коде правильный путь ресурса?Убедитесь, что getBaseURI возвращает значение.

Возможно, попробуйте:

Client client = new Client();
WebResource resource = client.resource(getBaseURI());
CarStore carStore = resource.path("/rest/cars").accept(MediaType.APPLICATION_XML).get(CarStore.class);
0 голосов
/ 07 февраля 2011

Что вы возвращаете в формате xml?Я не уверен, что делает getAllCars, но вы можете использовать что-то вроде Fiddler, чтобы помочь вам просмотреть трафик и посмотреть, что возвращается клиенту и находится ли он в надлежащем формате и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...