Ответ 1
Эта проблема исправлена с помощью jersey-bundle-1.8.jar
Я пытаюсь с простым примером Джерси + JSON, но я получаю следующую ошибку
message body writer for Java class com.test.jsonexample and MIME media type application/json was not found
Я помещаю следующие файлы jar для получения соответствующего результата
asm-3.1.jar
jackson-core-asl-1.9.9.jar
jackson-jaxrs-1.9.9.jar
jackson-mapper-asl-1.9.9.jar
jackson-xc-1.9.9.jar
jersey-client-1.9.jar
jersey-core-1.9.1.jar
jersey-json-1.9.jar
jersey-server-1.9.1.jar
jettison-1.3.2.jar
jsr311-api-1.1.1.jar
Почему я получаю этот тип ошибок? Журнал ошибок находится здесь:
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 com.test.Jsonexample, and Java type class com.test.Jsonexample, 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:1437)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>TestJaxRs</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.test.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
JsonExample.java
@XmlRootElement
public class JsonExample {
String title;
String singer;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
@Override
public String toString() {
return "JsonExample [title=" + title + ", singer=" + singer + "]";
}
}
и Json Service
@Path("/json/metallica")
public class JSONService {
@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public JsonExample getTrackInJSON() {
JsonExample json = new JsonExample();
json.setTitle("Enter Sandman");
json.setSinger("Metallica");
return json;
}
@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
public Response createTrackInJSON(JsonExample track) {
String result = "Track saved : " + track;
return Response.status(201).entity(result).build();
}
Пожалуйста, предложите мне, если я что-то сделаю неправильно.
Эта проблема исправлена с помощью jersey-bundle-1.8.jar
Исправлена ошибка, добавив следующее в мой pom.xml:
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency>
Документацию можно найти по адресу: https://code.google.com/p/genson/
Если вы не привязаны к джексону, вы можете попробовать библиотеку Genson http://owlike.github.io/genson/. Вам нужно только lib в вашем пути к классам, и каждая вещь должна работать без какого-либо дополнительного кода. Вам даже не придется использовать POJOMappingFeature в web.xml и не добавлять @XMLRootElement в ваше pojo!
Вы также можете вводить примеры Genson с определенными конфигурациями с использованием механизмов трикотажа (ContextResolver).
Прежде всего, если ваш веб-сервис @POST
возвращает ответ, вы должны добавить аннотацию @Produces
.
Убедитесь, что jersey-json
lib находится в вашем пути к классам.
Попробуйте удалить метод toString()
, поскольку он может сломать структурный формат beans.
Пробовал 'com.sun.jersey:jersey-bundle:1.19'
, и это не решило.
Устанавливает зависимость для genson
для меня.
runtime(
'com.owlike:genson:0.99'
)
Добавьте следующую зависимость для решения проблемы
"javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)"
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.18</version>
</dependency>
Я потратил буквально 4 дня на это и после гуглинга в течение нескольких часов и часов, почему мой POST не работал вообще. Я получал эту ошибку, а также другие ошибки, связанные с MOXY, такие как ошибка classdefnotfound, из-за людей в stackoverflow, предлагающих использовать MOXY вместо Jackson. Я также попробовал библиотеку Генсона, которая не давала никакой разницы.
В итоге я полностью удалил MOXY и оставил только Джексона. Через несколько часов я наконец нашел решение, из-за которого я разозлился из-за того, насколько он прост. Мое рабочее пространство разделено на несколько разных проектов, одно для веб-приложения, которое содержит web.xml и другое для API RESTful.
Я также использую Jersey 2, что было еще одной проблемой, так как многие принятые ответы на эту проблему говорили только о Джерси 1, и это было очень запутанно, когда я впервые пытался это решить.
По прошествии нескольких часов и часов он заканчивал с этим (используя структуру кода, опубликованную в OP):
Вам нужно включить @XmlRootElement в начало вашего класса POJO, вопреки многим примерам в stackoverflow, которые, похоже, его не содержат.
Вам нужно включить следующее в проект, включающий ваш web.xml, а также проект, включающий службу REST и связанные классы. Измените версию, относящуюся к версии Джерси, которую вы используете.
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.5.1</version>
</dependency>
Что это. Вам не нужно включать ничего кроме этого и соответствующих библиотек Джерси, которые вы используете.
Я серьезно надеюсь, что это поможет кому-то еще сэкономить время, пытаясь устранить эту проблему.
У меня была такая же проблема, и я исправил ее с удалением всех зависимостей json и добавлением com.owlike genson 0,99
Я знаю, что это старый вопрос, но я столкнулся с этими проблемами и попробовал все вышеупомянутые решения, но, к сожалению, ни один из них не помог мне. То, что я нашел, было то, что класс MediaType был определен в двух разных баночках, и при создании фляги он взял класс, который был определен в другом классе (в моем случае, в стеклянной банке). После удаления другой банки (вы также можете исключить конкретную часть) проблема была решена.
Для новой версии Maven, если у вас есть проблемы с зависимостью, вот хорошая официальная ссылка: https://jersey.java.net/documentation/latest/modules-and-dependencies.html#d0e383 (раздел 2.3.1, 2.3.2)
А также вот хороший учебник по установке maven и tuto of Jersey в eclipse: http://javaposts.wordpress.com/2012/01/14/maven-rest-jersey-eclipse-tutorial/
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- if you are using Jersey client specific features -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
Также проверьте фактический тип параметра метода post.
Имея также gson как зависимость, я должен использовать JSONObject (Jettison от Jersey-Json) вместо JsonObject (gson), что привело к тому же исключению.
Включите эти зависимости в свой POM.xml и запустите Maven → Update
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency>
При использовании jersey-bundle-1.19.1.jar(non-maven) мне пришлось удалить это:
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
из файла web.xml.
Я знаю, что документация предполагает, что этот раздел необходим, но на удивление это вызвало эту проблему.