Ответ 1
Вам необходимо аннотировать класс Region с помощью @XmlRootElement.
Я получил следующую трассировку стека при доступе к моим ресурсам jax-rs.
Я использую Tomcat 7, с Джерси 1.12 и Hibernate 4 и MySQL.
Я нашел это руководство во время поиска решения: http://aruld.info/handling-generified-collections-in-jersey-jax-rs/, но ни один из приведенных примеров не работал.
Что мне здесь не хватает?
Пожалуйста, нет ответов, которые мне пишут MessageBodyWriters
, это должно сработать. (И я знаю, что есть решение, я просто не могу понять это.)
Вот все мои банки:
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();
}
}
И вот stacktrace:
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)
Вам необходимо аннотировать класс Region с помощью @XmlRootElement.
как быстрое решение, которое я вижу:
final List<MyModel> myList = new ArrayList<>();
Response.ok().entity(new GenericEntity<List<MyModel>>(myList) {}).build();
Другой ответ не сработал у меня (у меня уже была аннотация XmlRootElement), но я, наконец, получил его для работы с JSON. Он просто возвращал XML, просто не JSON.
Я использовал jersey-bundle-1.17.jar(также пытался с asm-3.1.jar и jersey-json-1.17.jar добавлен в classpath и все еще не работал). Я, наконец, просто попробовал загрузить zip, который включает 12 различных банок. Как только я добавил все 12 банок в мой путь к классу, я, наконец, избавился от ошибки и отлично работает с JSON.
Надеюсь, это поможет кому-то.
EDIT: вот ссылка на zip файл, содержащий 12 файлов jar: jersey-archive-1.17.zip
@XmlRootElement с помощью этой аннотации можно выбрать JSON ou XML в Джерси. Большое вам спасибо!
Просто добавьте, чтобы отдохнуть: @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
В запросе, который вы задаете в заголовке, если вы выиграли возврат в xml или в json!
Поскольку вы ожидаете List, вы можете аннотировать свой класс bean с помощью @XmlRootElement. Но то же самое не будет работать для Карты. Джерси внутренне использует moxy для выполнения своей работы.
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();
добавить @@XmlRootElement
перед классом Region