Средство записи тела сообщения для типа Java, класса myPackage.B и типа носителя MIME, application / octet-stream, не найдено - PullRequest
28 голосов
/ 20 октября 2011

Я новичок в веб-сервисах 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-сессионный компонент, который я использую как веб-сервис 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, не найден .

Ниже приведены доменные объекты в моем автономном клиентском приложении, которое выполняет вызов сессионного компонента EJB AResource, который я использую в качестве веб-службы 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

}

Может ли кто-нибудь помочь мне понять, почему это происходит и как мне решить эту проблему?

Ответы [ 10 ]

30 голосов
/ 21 октября 2011

В вашем клиентском коде вы не указываете тип содержимого данных, которые вы отправляете, поэтому Джерси не может найти правильный MessageBodyWritter для сериализации объекта b1.

Измените последнюю строку вашего основного метода следующим образом:

ClientResponse response = resource.type(MediaType.APPLICATION_XML).put(ClientResponse.class, b1);

И добавьте аннотацию @XmlRootElement к классу B как на стороне сервера, так и на стороне клиента.

4 голосов
/ 11 июня 2014

Включите эти зависимости в ваш файл 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>
2 голосов
/ 18 ноября 2011

Вам необходимо указать @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>
1 голос
/ 10 марта 2017

Добавление ссылки на:

<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);
1 голос
/ 30 января 2013

Для устранения этой ошибки необходимо сделать две вещи.

  1. Отображение @xmlElement в модели
  2. На стороне клиента:

    response = resource.type(MediaType.APPLICATION_XML).put(ClientResponse.class, b1); //consume

    или

    response = resource.accept(MediaType.APPLICATION_XML).put(ClientResponse.class, b1); //produce

0 голосов
/ 18 декабря 2018

Убедитесь, что все эти библиотеки находятся в вашем пути к классам:

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» в конфигурацию клиента jersey:

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
clientConfig.getClasses().add(JacksonJsonProvider.class);

Thisрешай мне!

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);
}
0 голосов
/ 26 мая 2018

Это также происходит, если вам не хватает пустого открытого конструктора для сущности (может быть для JSON, XML и т. Д.) ..

0 голосов
/ 09 августа 2016

Это решило мою проблему.

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>
0 голосов
/ 01 июня 2016

Я столкнулся с той же проблемой для метода get, я возвращал "int" для метода @get. Странно, когда я изменяю тип возвращаемого значения на String, ошибка исчезла. Попробуйте, и если кто-то знает логику, стоящую за пожалуйста, поделитесь

0 голосов
/ 21 апреля 2015

Это также может произойти, если вы недавно обновили Ant. Я использовал Ant 1.8.4 в проекте, обновил Ant до 1.9.4 и начал получать эту ошибку при сборке толстого фляги с использованием Ant.

Решением для меня было вернуться к Ant 1.8.4 для командной строки и Eclipse , используя процесс, описанный здесь

...