Писатель тела сообщения для класса Java не найден
Я новичок в использовании JAX-RS и написал пример приложения, которое выводит объект json. но я получаю исключение. Вот мой код:
@Path("/hello")
public class HelloWorldService {
@GET
@Path("/query/{artist_id}")
@Produces("application/json")
public Data getMsg(@PathParam("artist_id") int artist_id,
@QueryParam("from") int from,
@QueryParam("to") int to) {
Data d=new Data();
d.setName("Mateen");
d.setRoll(77);
return d;
}
}
Мои данные - это просто класс POJO:
@XmlRootElement
public class Data {
private int roll;
private String name;
public int getRoll() {
return roll;
}
public void setRoll(int roll) {
this.roll = roll;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Я получаю исключение:
javax.ws.rs.WebApplicationException:
com.sun.jersey.api.MessageException:
A message body writer for Java class com.abc.data.Data,
and Java type class com.abc.data.Data,
and MIME media type application/json was not found
Что я делаю неправильно?
Ответы
Ответ 1
Наконец-то я нашел свой ответ. Я добавил
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.8</version>
</dependency>
в файл pom.xml. Затем я добавил
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
в мой файл web.xml, и все работает нормально. Для моего кода не было изменений.
Ответ 2
Я добавил следующие банки, и это сработало для меня
- ДЖЕКСОНА-ядро-ASL-1.9.2.jar
- ДЖЕКСОНА-картографа-ASL-1.9.2.jar
- ДЖЕКСОНА-хс-1.9.2.jar
- ДЖЕКСОНА-jaxrs-1.9.2.jar
Ответ 3
Просто небольшое дополнение. Если вы не используете файл дескриптора web.xml, вы можете включить POJOMappingFeatire программно, как показано ниже.
...
final ResourceConfig rc = new PackagesResourceConfig("com.test.resources");
final Map<String, Object> config = new HashMap<String, Object>();
config.put("com.sun.jersey.api.json.POJOMappingFeature", true);
rc.setPropertiesAndFeatures(config);
...
Ответ 4
Пользователь Maven: вам нужны только две зависимости.
<!-- For Jersey -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.15</version>
</dependency>
<!-- For JSON -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.15</version>
</dependency>
Выход XML поддерживается по умолчанию. Поэтому для этого не требуется никакой зависимости.
Ответ 5
Работая с Jersey 1.8, я получал ту же ошибку при создании объекта JSON и ударил API REST с клиентской стороны.
Если вы столкнулись с проблемой на стороне сервера, убедитесь, что вы правильно включили jersey-json.jar в classpath и сопоставили правильный init-param в web.xml, как упоминалось в других ответах.
Для клиентской стороны
В соответствии с документацией Jersey 1.8 следующий фрагмент показывает, как использовать функцию сопоставления POJO JSON на стороне клиента:
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,Boolean.TRUE);
Client client = Client.create(clientConfig);
Ответ 6
У меня была такая же проблема:
Писатель тела сообщения для типа Java, класс java.lang.String и тип носителя MIME, application/json, не был найден
Проблема заключалась в том, что класс
javax.ws.rs.ext.MessageBodyWriter был взят из
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.2</version>
</dependency>
Соприкасался с тем же классом:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.1</version>
</dependency>
Ответ 7
У меня была та же проблема, но моя ошибка заключалась в том, что я импортировал неправильную библиотеку с именем javax.websocket.sever для аннотации PathParam в классе REST. Я надеюсь, что это поможет вам