Ответ 1
Я смог исправить проблему, добавив зависимость maven от jersey-json.
У меня есть основанный на Джерси Rest WS, который выводит JSON. Я осуществляю Джерси-клиент, чтобы вызывать WS и потреблять ответ JSON. Код клиента у меня ниже
WebResource r = restClient.resource(UriBuilder.fromUri("http://localhost/").port(8080).build()); String resp = r.path("/user").accept(MediaType.APPLICATION_JSON).get(String.class); User[] users = r.path("/user").accept(MediaType.APPLICATION_JSON).get(User[].class);
Вторая строка выводит корректный ответ строки JSON, однако 3-я строка для маршалирования JSON для POJO не происходит, и я получаю следующее исключение stacktrace
SEVERE: A message body reader for Java class [Lorg.shoppingsite.model.entity.jpa.User;, and Java type class [Lorg.shoppingsite.model.entity.jpa.User;, and MIME media type application/json was not found Dec 21, 2011 11:32:01 AM com.sun.jersey.api.client.ClientResponse getEntity SEVERE: The registered message body readers compatible with the MIME media type are: */* -> com.sun.jersey.core.impl.provider.entity.FormProvider com.sun.jersey.core.impl.provider.entity.StringProvider com.sun.jersey.core.impl.provider.entity.ByteArrayProvider com.sun.jersey.core.impl.provider.entity.FileProvider com.sun.jersey.core.impl.provider.entity.InputStreamProvider com.sun.jersey.core.impl.provider.entity.DataSourceProvider com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General com.sun.jersey.core.impl.provider.entity.ReaderProvider com.sun.jersey.core.impl.provider.entity.DocumentProvider com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General com.sun.jersey.core.impl.provider.entity.EntityHolderReader
У меня есть правильный MIME TYPES в моем запросе. Мой POJO был аннотирован XMLRootElement. Что мне не хватает.
Спасибо
Я смог исправить проблему, добавив зависимость maven от jersey-json.
Чтобы он работал, вам нужно всего две вещи. Проверьте, не хватает ли вы:
Вам нужно добавить зависимость для jersey-json, если вам не хватает. Для вашей справки я добавил эту зависимость в свой pom.xml.
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.17.1</version>
</dependency>
Я знаю, что этот пост старый, и вы давно это поняли, но просто чтобы спасти людей, которые прочтут это некоторое время.
Вероятно, вы забыли добавить аннотацию к сущности, которую вы передаете в конечную точку, поэтому Джерси не знает, как обрабатывать POJO, который он получает. Аннотируйте pojo примерно следующим образом:
@XmlRootElement(name = "someName")
просто поставьте это
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Если вы создаете uberjar, убедитесь, что ваши метафайлы meta inf объединены. (Это бит меня несколько раз в проекте dropwizard.)
Если вы используете плагин gradle shadowJar, вы должны вызвать mergeServiceFiles()
в своем целевом shadowJar
: https://github.com/johnrengelman/shadow#merging-service-files
Не знаете, что аналогичные команды для maven или других систем сборки.
Мы также решили использовать трикотаж в качестве решения. Но поскольку мы используем org.JSON в большинстве случаев, эта зависимость не нужна, и мы чувствовали себя не очень хорошо.
Поэтому мы использовали представление String для получения объекта org.JSON вместо
JSONObject output = response.getEntity(JSONObject.class);
мы используем его следующим образом:
JSONObject output = new JSONObject(response.getEntity(String.class));
где JSONObject поступает из org.JSON, и импорт может быть изменен с:
-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
В моем случае я использую POJO. И я забыл настроить POJOMappingFeature как истину. Майкон указал на это в раннем ответе. Однако некоторым парням может быть сложно правильно настроить его в web.xml, вот мой пример.
<servlet>
<servlet-name>Jersey Servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<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>
Просто добавьте ниже строки в POJO перед началом класса, и ваша проблема будет решена. @Produces ( "Применение/JSON" ) @XmlRootElement См. Пример импортировать javax.ws.rs.Produces; import javax.xml.bind.annotation.XmlRootElement;
/**
* @author manoj.kumar
* @email [email protected]
*/
@Produces("application/json")
@XmlRootElement
public class User {
private String username;
private String password;
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
add below lines inside of your web.xml
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Now recompile your webservice everything would work!!!
Попробуйте добавить:
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>1.4</version>
</dependency>
Также эта проблема может возникнуть, если вы используете HTTP GET
с телом сообщения, поэтому в этом случае добавление jersey-json lib, @XmlRootElement
или изменение web.xml не поможет. Вы должны использовать URL QueryParam
или HTTP POST
.
Вам нужно реализовать свои собственные MessageBodyReader
и MessageBodyWriter
для вашего класса Lorg.shoppingsite.model.entity.jpa.User
.
package javax.ws.rs.ext;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
public interface MessageBodyReader<T extends Object> {
public boolean isReadable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public T readFrom(Class<T> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException;
}
package javax.ws.rs.ext;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
public interface MessageBodyWriter<T extends Object> {
public boolean isWriteable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public long getSize(T t,
Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public void writeTo(T t,
Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException, WebApplicationException;
}
Просто проверьте, выполняете ли вы разные экземпляры в eclipse. Я оставил все мои другие сеансы, чистая сборка исправила проблему.
Некоторые могут быть смущены, почему добавление jersey-json jar не может решить эту проблему. Я узнал, что эта банка должна быть более новой, чем jersey-json-1.7.jar(1.7.0 не работает, но 1.7.1 отлично работает). надеюсь, что это поможет
Шахта была похожей ситуации. Я получаю эту ошибку в критические моменты, и я не помнил, как я ее решил раньше, что я делал много раз. После напряженных часов осмотра я решил и воспроизвел ошибку и убедился, насколько простым является решение этой ситуации.
Хорошо - решение: удалить (или исправить) все внесенные изменения в ваши основные файлы свойств проекта.
Да, это он. Фактически, мой проект является многомодульным, и вы знаете, что без правильных зависимостей это редкий случайный сценарий, который часто выбирается из git (RAC тоже). Мой проект получал почти все настраиваемые вещи из файла свойств, который является общим для примерно 15 модулей (подпроектов) с хорошим количеством внутризависимых связей между ними. jersey-json зависимость всегда присутствует в моем объединенном родительском pom. XML-аннотации не являются проблемой, так как проект выполняется примерно 100 раз после их модификации. некоторые решения здесь указывают на web.xml и такие вещи, как POJOMappingFeature. В моем случае я даже не коснулся модуля webapp в этой сборке. так или иначе, это решение сработало для меня, и я трачу время, чтобы записать это в SO, если я когда-нибудь попаду в эту ошибку, мне не придется терять сонливые ночи. (конечно, для вас тоже)