Service REST qui accepte et renvoie l'objet. Comment écrire client?
J'ai déclaré deux services web REST. Celui qui retourne simplement un objet. Et d'autres qui accepte un objet et renvoie un autre objet.
POJO Order.java est utilisée.
@XmlRootElement
public class Order {
private String id;
private String description;
public Order() {
}
@XmlElement
public String getId() {
return id;
}
@XmlElement
public String getDescription() {
return description;
}
//Other setters and methods
}
Webservice est défini comme
@Path("/orders")
public class OrdersService {
//Return the list of orders for applications with json or xml formats
@Path("/oneOrder")
@GET
@Produces({MediaType.APPLICATION_JSON})
public Order getOrder_json() {
System.out.println("inside getOrder_json");
Order o1 = OrderDao.instance.getOrderFromId("1");
System.out.println("about to return one order");
return o1;
}
@Path("/writeAndIncrementOrder")
@GET
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Order writeAndIncrementOrder(Order input) {
System.out.println("inside writeAndIncrementOrder");
Order o1 = new Order();
o1.setId(input.getId()+1000);
o1.setDescription(input.getDescription()+"10000");
System.out.println("about to return one order");
return o1;
}
Je pourrais écrire du code client pour appeler le service web que ne pas accepter n'importe quoi, mais renvoie l'objet. Client code est comme suit
import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.jersey.client.ClientConfig;
public class Test {
public static void main(String[] args) {
WebTarget target2 = client.target(getBaseURI()).path("rest").path("orders");
String o2 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(String.class);
System.out.println(o2);
}
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost:8090/FirstRESTProject").build();
}
Mais je ne comprends pas comment appeler un autre service qui accepte ainsi que renvoie l'objet.
J'ai essayé différentes solutions données sur internet. Mais rien n'a fonctionné pour moi. Une solution ne fonctionne que pour l'envoi de l'objet et certains ne fonctionne que pour les accepter. Mais aucun n'a fonctionné pour faire les deux en un seul appel.
MODIFIER
Comme suggéré ci-dessous la réponse que j'ai enregistré JacksonJaxbJsonProvider.class Mais l'auto-conversion en objets d'Ordre n'est pas le cas.
String o2 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(String.class);
client.register(JacksonJaxbJsonProvider.class);
Order o4 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(Order.class);
Dans le programme ci-dessus j'ai réussi à obtenir string {"id":"1","description":"C'est la 1ère commande"} Mais l'obtention d'objet direct déclenche une erreur
MessageBodyReader pas trouvé le type de support=application/json, type=shopping de classe.panier.om.L'ordre, genericType=shopping de classe.panier.om.Ordre.
Je suis vraiment confus. Chaque suggestion que je reçois j'ai essayer de modifier le code. Puis-je ajouter quelques pots. Maintenant, mon client et le serveur ont tous deux beaucoup de pots. Je ne sais pas laquelle tous les besoins et tous les est la bonne combinaison.
Êtes-vous à l'aide de Maven? Et la version de Jersey êtes-vous essayer, à utiliser?
Essayez
target2.register(JacksonJaxbJsonProvider.class)
Je ne suis pas à l'aide de Maven. Je suis la création de projets dans Eclipse.Et les deux sont différents projets.
OriginalL'auteur Kaushik Lele | 2015-03-14
Vous devez vous connecter pour publier un commentaire.
Si vous prenez un peu de temps pour comprendre le
WebTarget
de l'API, ainsi que les différents types retourné les appels àWebTarget
'méthode, vous devriez obtenir une meilleure compréhension de la façon de faire des appels. Il peut être un peu déroutant, comme presque tous les exemples de l'utilisation de la méthode de chaînage, c'est un moyen très pratique, mais ce faisant, vous oubliez toutes les classes impliquées dans la création et l'envoi de la demande. Laisser décomposer un peuWebTarget.path()
retourne simplement l'WebTarget
. Rien d'intéressant.WebTarget.request()
retourneInvocation.Builder
Invocation.Builder.accept(..)
retourneInvocation.Builder
Invocation.Builder.get()
appelle sa de la classe superSyncInvoker.get()
, qui en fait la demande, et renvoie un type, basée sur l'argument que nous fournissons àget(Class returnType)
Ce que vous faites avec
get(String.class)
est dire que le flux de réponse devrait être désérialisée dans un Dard de ce type de réponse. Ce n'est pas un problème, tant que JSON est intrinsèquement juste une Chaîne de caractères. Mais si vous voulez unmarshal à un POJO, alors vous devez avoir unMessageBodyReader
qui sait comment unmarshal JSON de votre POJO type. Jackson donne uneMessageBodyReader
dansjackson-jaxrs-json-fournisseur
dépendanceLa plupart des implémentations de fournisseur d'un wrapper pour ce module, comme
jersey-media-json-jackson
pour le Jersey ouresteasy-jackson-provider
pour Resteasy. Mais ils sont encore à l'aide de la sous-jacentesjackson-jaxrs-json-provider
.Cela étant dit, une fois que vous avez ce module sur le chemin de la classe, est devrait être automatiquement enregistrées, de sorte que la
MessageBodyReader
seront disponibles. Si non, vous pouvez l'inscrire explicitement avec le client, commeclient.register(JacksonJaxbJsonProvider.class)
. Une fois que vous avez la Jackson soutien configuré, vous pouvez simplement faire quelque chose commeQue pour poster/envoi de données, vous pouvez à nouveau consulter les différentes
Invocation.Builder
méthodes. Par exempleSi nous voulons post, regardez les différents
post
méthodes disponibles. Nous pouvons utiliserResponse post(Entity<?> entity)
- Notre demande pourrait ressembler à quelque chose commeVous remarquerez la
Entité
. Tous lespost
méthodes d'accepter uneEntity
, et ce est la façon dont la demande de savoir quels types le corps de l'entité doit être, et le client doit appeler le juge appropriéMessageBodyWriter
ainsi que de définir l'en-tête approprié<T> T post(Entity<?> entity, Class<T> responseType)
- Il y a une autre surcharge, où l'on peut spécifier le type de unmarshal, au lieu de se remettre unResponse
. Nous pourrions faireNoter qu'avec
Response
, nous avons fait appel à sonreadEntity(Class pojoType)
méthode de lecture à partir de laResponse
, le corps de l'entité. L'avantage de cela, c'est que leResponse
objet est livré avec un grand nombre d'informations utiles que nous pouvons utiliser, comme les en-têtes et ces. Personnellement, j'ai toujours leResponse
En aparté, pour votre code que vous affichez, vous plus susceptibles de vouloir en faire un
@POST
méthode. Rappelez-vous@GET
est principalement pour la récupération des données,PUT
pour la mise à jour, etPOST
pour la création. C'est une bonne règle de base à respecter, lors du premier démarrage. Donc, vous pouvez modifier la méthode deEnsuite, vous pouvez faire
Note le ci-dessus est pour le Jersey/JAX-RS 2 client, votre code d'origine. Mais maintenant, après votre post de votre web.xml et votre exception, il semble que vous utilisez Jersey 1. Donc, je suis complètement confus. Pour obtenir de l'aide, je vais avoir besoin de quelques éclaircissements. Voir mon commentaire pour le post original
OriginalL'auteur Paul Samsotha
Vous devez utiliser des POST ou PUT, au lieu d'OBTENIR
essayer ce code
J'ai essayé ta suggestion. Mais il est en train de jeter exception Provoquée par: com.soleil.jersey.l'api.client.ClientHandlerException: le corps d'Un message écrivain de type Java, le shopping de classe.panier.om.L'ordre, et le type MIME application/json, n'a pas été trouvé
Il ressemble à côté client en erreur. Car même si mon Serveur est arrêté, je reçois toujours la même erreur. Cela signifie qu'il n'atteint pas même côté serveur.
essayez d'ajouter
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.8</version> </dependency>
à votre pom.xml fichier version du jeu à la réelle jersey versionmerci pour votre réponse. Finalement j'ai pu obtenir le travail client. J'ai eu de maj de maven que j'étais pris au piège dans la jungle des jarres.
OriginalL'auteur Dmitry Zaytsev