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?
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.
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>
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);
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);
}
Cela se produit également s'il vous manque un constructeur public vide pour l'entité (par exemple JSON, XML, etc.).
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
Cela a résolu mon problème.
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>