5 votes

GetEntity vs ReadEntity en réponse (Javax.ws.rs)

J'écris un client pour consommer un RestService et je dois lire une entité à partir de la réponse et je ne sais pas quelle méthode utiliser parmi les deux ( getEntity vs readEntity ) doit être utilisé.

Je dois récupérer l'entité chaque fois que je reçois une WebApplicationException.

Donc, mon code ressemble plus ou moins à ça.

catch(WebApplicationException ex) {
// Do something with ex.getResponse
}

De, tout ce que j'ai testé,

ex.getResponse().hasEntity() ---> true

ex.getResponse().getEntity() == null ---> true

Je ne sais pas comment cela fonctionne, mais si la première affirmation est vraie, comment la seconde pourrait-elle l'être ?

De manière surprenante, readEntity a bien fonctionné pour moi et j'ai pu lire le fichier l'entité à partir de la réponse.

Mais, après avoir lu l'entité à travers readEntity,

cet appel donne faux.

 ex.getResponse().getEntity() == null --> false

Quelqu'un peut-il m'aider à comprendre ce qui se passe réellement en coulisses ?

12voto

peeskillet Points 32287

El Response a deux utilisations : côté serveur et côté client. Côté serveur, elle est appelée sortant réponse. Sur le client, c'est entrant réponse.

Outbound

@GET
public Response get() {
    MyModel model = new MyModel();
    return Response.ok(model).build();
}

Inbound

Response response = ClientBuilder.newClient().target(url).request().get();

El getEntity() est destinée à être utilisée du côté du serveur car vous voulez obtenir l'entité objet . Il n'y a pas beaucoup d'utilité pour nous, mais Jersey va l'utiliser pour récupérer l'objet entité pour le sérialiser avant de l'envoyer.

El readEntity() doit être utilisée du côté client car vous essayez de lire le flux d'entités. Si vous essayez d'appeler cette fonction du côté du serveur, vous obtiendrez une erreur indiquant que vous ne pouvez pas lire le flux sur une réponse sortante.

En ce qui concerne le comportement que vous rencontrez, je ne peux pas vraiment expliquer pourquoi ils ont été mis en œuvre de cette façon.

7voto

Cecilya Points 300

Ce comportement est documenté dans le API :

public abstract <T> T readEntity(Class<T> entityType)

Lire le flux d'entrée de l'entité de message en tant qu'instance du type Java spécifié en utilisant un MessageBodyReader qui prend en charge le mappage du flux de l'entité de message sur le type demandé.

[...]

Une instance de message renvoyée par cette méthode sera mis en cache pour les récupérations ultérieures via getEntity(). .

Le premier appel à ex.getResponse().getEntity() est nul, car l'entité n'a pas encore été lue. Après avoir appelé readEntity() l'entité analysée sera retournée telle qu'elle a été analysée par getEntity() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X