Писатель тела сообщения для типа Java, класс myPackage.B и тип носителя MIME, приложение/октет-поток не были найдены
Я новичок в веб-сервисах RESTful и пытался обновить отношения @OneToMany
от автономного клиентского приложения, но я не могу этого сделать. Я использую реализацию JAX-RS в Джерси, которая поставляется с Glassfish 3.1.1.
У меня есть класс A
, который имеет отношение @OneToMany
к классу B
.
MyRestClient
- мой автономный клиент, который вызывает мой веб-сервис RESTful, который был развернут на Glassfish 3.1.1.
MyRestClient.java
public class MyRestClient {
public static void main(String[] args) {
Client client = Client.create();
WebResource resource = client.resource("http://localhost:8080/myapp/rest/a/update/123");
B b1 = new B("debris");
ClientResponse response = resource.put(ClientResponse.class, b1);
System.out.println(response.getEntity(A.class).getTitle() + " has " + response.getEntity(A.class).getBList().size() + " Bs.");
}
}
AResource
- это сеанс EJB bean, который я использую как веб-сервис RESTful.
AResource.java
@Stateless
@Path("/a")
public class AResource {
@EJB
private AManager aManager;
@PUT
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
@Path("/update/{id}")
public Response updateA(B b, @PathParam("id") int id) {
A a = aManager.findAById(id);
a.addB(b);
return Response.status(Status.OK).entity(a).build();
}
}
Когда я запускаю клиент, я получаю следующее сообщение об ошибке:
com.sun.jersey.api.client.ClientHandlerException: писатель тела сообщения для типа Java, класс myPackage.B и тип носителя MIME, application/octet-stream не найден.
Ниже перечислены объекты домена в моем автономном клиентском приложении, которое делает вызов сеанса AResource
EJB bean, который я использую как веб-сервис RESTful.
A.java
@XmlRootElement
public class A implements Serializable{
private List<B> bList = new ArrayList<B>();
public List<B> getBList() {
return bList;
}
//remaining code
}
B.java
public class B implements Serializable {
private String text;
private A a;
@XmlTransient
public A getA() {
return a;
}
public void afterUnmarshal(Unmarshaller u, Object parent) {
this.a = (A) parent;
}
//remaining code
}
Может кто-нибудь помочь мне понять, почему это происходит и как я должен решить эту проблему?
Ответы
Ответ 1
В коде клиента вы не указываете тип содержимого данных, которые вы отправляете, поэтому Джерси не может найти правильный MessageBodyWritter для сериализации объекта b1.
Измените последнюю строку основного метода следующим образом:
ClientResponse response = resource.type(MediaType.APPLICATION_XML).put(ClientResponse.class, b1);
И добавьте аннотацию @XmlRootElement к классу B как на сервере, так и на стороне клиента.
Ответ 2
Включите эти зависимости в свой 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>
Ответ 3
Вам нужно указать @Provider
, что @Produces(MediaType.APPLICATION_XML)
из B.class
Добавьте пакет вашего MessageBodyWriter<B.class>
к вашему /WEB_INF/web.xml
как:
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>
your.providers.package
</param-value>
</init-param>
Ответ 4
Вы должны сделать две вещи, чтобы удалить эту ошибку.
- Отображение
@xmlElement
в модели
-
Клиентская сторона:
response = resource.type(MediaType.APPLICATION_XML).put(ClientResponse.class, b1); //consume
или
response = resource.accept(MediaType.APPLICATION_XML).put(ClientResponse.class, b1); //produce
Ответ 5
Добавление ссылки на:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>${jersey1.version}</version>
</dependency>
Пока добавление clientConfig.getFeatures(). put (JSONConfiguration.FEATURE_POJO_MAPPING, true); при создании клиента решила проблему для меня:
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
Client client = Client.create(clientConfig);
Ответ 6
Это также может произойти, если вы недавно обновили Ant. Я использовал Ant 1.8.4 в проекте и обновил Ant до 1.9.4 и начал получать эту ошибку при создании жировой банки с помощью Ant.
Решение для меня состояло в том, чтобы вернуться к Ant 1.8.4 для командной строки и Eclipse используя описанный здесь процесс
Ответ 7
i столкнулся с одной и той же проблемой для метода get я возвращал "int" для метода @get Странно, когда я меняю тип возвращаемого значения на String, ошибка исчезла. Попробуйте, и если кто-то знает логику это любезно поделиться им
Ответ 8
Это решило мою проблему.
http://www.markhneedham.com/blog/2012/11/28/jersey-com-sun-jersey-api-client-clienthandlerexception-a-message-body-reader-for-java-class-and-mime-media-type-applicationjson-was-not-found/
Включение следующих зависимостей в ваш POM.xml и запуск Maven → Update также устранило мою проблему.
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.19.1</version>
</dependency>
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency>
Ответ 9
Это также происходит, если вам не хватает пустого открытого конструктора для сущности (может быть для JSON, XML и т.д.).
Ответ 10
Убедитесь, что все эти библиотеки находятся в вашем классе:
compile(group: 'com.sun.jersey', name: 'jersey-core', version: '1.19.4')
compile(group: 'com.sun.jersey', name: 'jersey-server', version: '1.19.4')
compile(group: 'com.sun.jersey', name: 'jersey-servlet', version: '1.19.4')
compile(group: 'com.sun.jersey', name: 'jersey-json', version: '1.19.4')
compile(group: 'com.sun.jersey', name: 'jersey-client', version: '1.19.4')
compile(group: 'javax.ws.rs', name: 'jsr311-api', version: '1.1.1')
compile(group: 'org.codehaus.jackson', name: 'jackson-core-asl', version: '1.9.2')
compile(group: 'org.codehaus.jackson', name: 'jackson-mapper-asl', version: '1.9.2')
compile(group: 'org.codehaus.jackson', name: 'jackson-core-asl', version: '1.9.2')
compile(group: 'org.codehaus.jackson', name: 'jackson-jaxrs', version: '1.9.2')
compile(group: 'org.codehaus.jackson', name: 'jackson-xc', version: '1.9.2')
Добавьте "Pojo Mapping" и "Jackson Provider" в конфигурацию клиента джерси:
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
clientConfig.getClasses().add(JacksonJsonProvider.class);
Это решить для меня!
ClientResponse response = null;
response = webResource
.type(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.get(ClientResponse.class);
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
MyClass myclass = response.getEntity(MyClass.class);
System.out.println(myclass);
}