Подтвердить что ты не робот

Писатель тела сообщения для типа 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

}

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

4b9b3361

Ответ 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);
}