Проблема с Restful WebService - PullRequest
       360

Проблема с Restful WebService

3 голосов
/ 03 марта 2011

Я работаю над веб-сервисом RestFul, я написал небольшой релакс-сервис, который возвращает данные json, вот мой код:

@Path("/test")

открытый класс TestService {

@GET
@Produces(MediaType.APPLICATION_JSON)
public String sayHello() {
    return "<h6> Hello, Welcome to the world of REST (Plain Text) </h6>";
}
@GET
@Path("dbdetails")
@Produces(MediaType.APPLICATION_JSON)
public Map<String, List> getDBDetails() {
    System.out.println("ramesh kumar ");
    List<ProductCategories> list = new ArrayList<ProductCategories>();
    HashMap<String,List> map = new HashMap<String,List>();
    ProductCategories cat = new ProductCategories();
    cat.setId(1);
    cat.setImage("Image21");
    cat.setName("Electronics");
    cat.setRowid(111);
    cat.setType("CatType");
    list.add(cat);
    map.put("Ramesh",list);
    System.out.println("ramesh kumar ");
    return map;

}

Но я получаю сообщение об ошибке:

SEVERE: средство записи тела сообщения для типа Java, класса java.util.HashMap и типа носителя MIME, application / json, не найдено 3 марта 2011 г. 3: 32: 41 PM com.sun.jersey.server.impl.application.WebApplicationImpl onException SEVERE: внутренняя ошибка сервера

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Под прикрытием Джерси использует JAXB для маршалинга.Во-первых, если вы не включили артефакт jersey-json, он вообще не будет работать с JSON.Это может привести к ошибке, которую вы опубликовали.Во-вторых, JAXB использует аннотации, чтобы определить, как упорядочить и распаковать вещи.Чтобы упорядочить объект с помощью JAXB, его класс должен быть аннотирован с помощью @ XmlRootElement .Если класс не аннотирован, Джерси подумает, что не знает, как упорядочить объект, и снова вы получите ту же ошибку.Я не на 100% уверен в использовании GenericEntity, он мне никогда не был нужен, но я не думаю, что это поможет вам здесь.Я считаю, что есть два общепринятых решения вашей проблемы:

  1. Оберните вашу Карту в JAXBElement .
  2. Напишите свою собственную обертку для карты, котораяаннотируется @ XmlRootElement.

Я думаю, что большинство людей склонны выбирать второй вариант.Вы можете найти множество обсуждений по этой проблеме в архиве списка рассылки пользователей jersey .

1 голос
/ 03 марта 2011

Это похоже на сценарий удаления типа. Вы должны использовать GenericEntity в качестве типа возврата. Ваш код должен выглядеть примерно так:

public GenericEntity<Map<String, List>> getDBDetails() { 
.
.
.
        return  new GenericEntity<Map<String, List>> (map) {};
}
...