web-dev-qa-db-fra.com

Écrivain du corps du message pour le type Java, classe myPackage.B et le type de média MIME, application/octet-stream, est introuvable.

Je suis nouveau sur les services Web RESTful et j'essayais de mettre à jour ma relation @OneToMany à partir d'une application client autonome, mais je ne suis pas en mesure de le faire. J'utilise la version Jersey de JAX-RS fournie avec Glassfish 3.1.1.

J'ai une classe A qui a une relation @OneToMany avec la classe B.

MyRestClient est mon client autonome qui appelle mon service Web RESTful qui a été déployé sur 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 est un bean de session EJB que j'utilise comme service Web 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();
    }
}

Lorsque j'exécute le client, le message d'erreur suivant s'affiche: com.Sun.jersey.api.client.ClientHandlerException: un rédacteur de corps de message de type Java, classe myPackage.B, et type de support MIME, application/octet-stream, n'a pas été trouvé .

Voici les objets de domaine de mon application client autonome qui appelle le bean session AResource EJB que j'utilise en tant que service Web 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

}

Quelqu'un pourrait-il m'aider à comprendre pourquoi cela se produit et comment je devrais résoudre ce problème?

28
skip

Dans votre code client, vous ne spécifiez pas le type de contenu des données que vous envoyez - donc Jersey ne peut pas localiser le message MessageBodyWritter approprié pour sérialiser l'objet b1.

Modifiez la dernière ligne de votre méthode principale comme suit:

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

Et ajoutez les annotations @XmlRootElement à la classe B sur le serveur et le côté client.

30
Martin Matula

Incluez ces dépendances dans votre fichier POM.xml et exécutez 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>
4
borchvm

Vous devez spécifier le @Provider that @Produces(MediaType.APPLICATION_XML) à partir de B.class
Un ajout du paquet de votre MessageBodyWriter<B.class> à votre /WEB_INF/web.xml en tant que: 

<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>
your.providers.package
</param-value>
</init-param>

Ajouter une référence à:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>${jersey1.version}</version>
</dependency>

En ajoutant clientConfig.getFeatures (). Put (JSONConfiguration.FEATURE_POJO_MAPPING, true); sur la création de client a résolu le problème pour moi:

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
Client client = Client.create(clientConfig);
1
llatinov

je faisais face au même problème pour une méthode get. Je renvoyais un "int" pour la méthode @get. Étrangement, lorsque je modifie le type de retour en String, l'erreur a disparu. Donnez-lui un essai et si quelqu'un connaît la logique derrière le partage aimablement il 

Assurez-vous que toutes ces bibliothèques sont dans votre chemin de classe:

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')

Ajoutez "Pojo Mapping" et "Jackson Provider" à la configuration du client du maillot:

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

Cette résoudre pour moi!

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
Jadson Santos

Cela se produit également s'il vous manque un constructeur public vide pour l'entité (par exemple JSON, XML, etc.).

0
vmhacker

Cela peut également arriver si vous avez récemment mis à jour Ant. J'utilisais Ant 1.8.4 sur un projet et j'ai mis Ant à niveau à la version 1.9.4, et j'ai commencé à avoir cette erreur lors de la construction d'un bocal de graisse utilisant Ant.

La solution pour moi était de revenir à Ant 1.8.4 pour la ligne de commande et à Eclipse en utilisant le processus détaillé ici

0
Brad Parks

Cela a résolu mon problème.

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/

L'inclusion des dépendances suivantes dans votre fichier POM.xml et l'exécution de Maven -> Update a également corrigé mon problème.

<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
choom