2012-06-14 4 views
28

Я получил следующую трассировку стека при доступе к моим ресурсам jax-rs.Писатель тела сообщения для Java-класса java.util.ArrayList

Я использую Tomcat 7, с Джерси 1.12 и Hibernate 4 и MySQL.

Я нашел это руководство во время поиска решения: http://aruld.info/handling-generified-collections-in-jersey-jax-rs/, но ни один из приведенных примеров не работал.

Что мне здесь не хватает?

Пожалуйста, никаких ответов, которые у меня есть, написано , это должно сработать. (И я знаю, что есть решение, я просто не могу понять это.)

Вот все мои баночки:

antlr-2.7.7.jar 
asm-3.1.jar 
commons-collections-3.2.1.jar 
dom4j-1.6.1.jar 
gson-1.7.1.jar 
hibernate-commons-annotations-4.0.1.Final.jar 
hibernate-core-4.1.0.Final.jar 
hibernate-jpa-2.0-api-1.0.1.Final.jar 
jackson-core-asl-1.9.2.jar 
jackson-jaxrs-1.9.2.jar 
jackson-mapper-asl-1.9.2.jar 
jackson-xc-1.9.2.jar 
javassist-3.15.0-GA.jar 
jboss-logging-3.1.0.CR2.jar 
jboss-transaction-api_1.1_spec-1.0.0.Final.jar 
jersey-client-1.12.jar 
jersey-core-1.12.jar 
jersey-json-1.12.jar 
jersey-server-1.12.jar 
jersey-servlet-1.12.jar 
jettison-1.1.jar 
jsr311-api-1.1.1.jar 
mysql-connector-java-3.1.12-bin.jar 

Вот мой класс ресурсов и метод:

@Path("/region") 
public class RegionService { 
    // This method is called if TEXT_PLAIN is request 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public JResponse<List<Region>> region() { 
     RegionDao regionDao = new RegionDao(); 
     regionDao.openSession(); 
     List<Region> regions = regionDao.getAll(); 
     regionDao.closeSession(); 
     return JResponse.ok(regions).build(); 
    } 
} 

И вот стоп-трасса:

SEVERE: Mapped exception to response: 500 (Internal Server Error) 
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<campher.hibernate.entities.Region>, and MIME media type application/json was not found 
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1451) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414) 
+5

Кажется похож: HTTP: // StackOverflow.com/вопросы/5161466/how-do-i-use-the-jersey-json-pojo-support –

+2

Большое спасибо. Это точно! На самом деле это вопрос, который решил мою проблему. Мне нужно было добавить параметр com.sun.jersey.api.json.POJOMappingFeature. * facepalm * – n4rzul

+0

Каков наилучший способ решить этот вопрос сейчас? Не могли бы вы оставить свой комментарий в качестве ответа или просто удалить этот глупый вопрос? – n4rzul

ответ

36

Вам необходимо аннотировать класс Region с помощью @XmlRootElement.

+0

Спасибо! Я уже потратил 5 часов на то, чтобы вытащить мои волосы! –

+1

Я только что приехал сюда во второй раз. Вы заслуживаете моего +1 – luigi7up

+0

http://stackoverflow.com/questions/17342218/getting-error-a-message-body-writer-for-java-class-java-util-arraylist-listjava .. вы можете решить это? ? – user2416728

7

Другой ответ не сработал для меня (у меня уже была аннотация XmlRootElement), но я, наконец, получил его для работы с JSON. Он просто возвращал XML, просто не JSON.

Я использовал jersey-bundle-1.17.jar (также пытался с asm-3.1.jar и jersey-json-1.17.jar добавлен в classpath и все еще не работал). Я, наконец, просто попробовал загрузить zip, который включает 12 различных банок. Как только я добавил все 12 банок в мой путь к классам, я, наконец, избавился от ошибки и отлично работает с JSON.

Я надеюсь, что это поможет кому-то.

EDIT: Вот ссылка на почтовый файл, который содержит файлы 12 фляги: jersey-archive-1.17.zip

+0

Как-то это работает. Я думаю, благодаря файлу javax.ws.rs.ext.MessageBodyWriter в jersey-server.jar/META-INF;) Он имеет значение «com.sun.jersey.server.impl.template.ViewableMessageBodyWriter» внутри – tuxSlayer

+0

+1. Точно, какие «12 разных банок» вы добавили? Пожалуйста, любезно упомяните их! или дать пример проекта, пожалуйста. –

+0

Несомненно, http://repo1.maven.org/maven2/com/sun/jersey/jersey-archive/1.17.1/jersey-archive-1.17.1.zip – 11101101b

2

@XmlRootElement с этой аннотацией Можно выбрать JSON Ou XML в Джерси. Большое спасибо!

Просто добавьте отдых это: @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})

По запросу вы установите на заголовок, если вы выиграли возвращение в XML или в JSON!

-1
You can use JSONObject to create a Json Response 

    eg: 

    List<Region> regions = regionDao.getAll(); 
    JSONArray list = new JSONArray(); 
    for(Region region : regions) 
    { 
     JSONObject jObject= new JSONObject(); 
     //put all the data in json object 
     jObject.put(region.getSomething()); 
     // and put this Jsonobject in JsonArray 
     list.add(jObject); 
    } 

Or 

Response.ok().entity(new GenericEntity<List<Region>>(regions) {}).build(); 
+0

какой пакет, например JSONArray, ? –

+0

Он поставляется в java-json jar ... Он доступен по адресу http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm –

9

как быстрое решение я вижу:

final List<MyModel> myList = new ArrayList<>(); 
Response.ok().entity(new GenericEntity<List<MyModel>>(myList) {}).build(); 
-2

добавить @@XmlRootElement до вашего класса Регион

1

Как вы ожидаете список, вы можете аннотировать класс компонента с @XmlRootElement. Но то же самое не будет работать для Карты. Джерси внутренне использует moxy для выполнения своей работы.

0

Добавить зависимость

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>${jersey-version}</version> 
</dependency> 
Смежные вопросы

 Смежные вопросы