JAX-RS 2 imprimer JSON demande
J'aimerais être en mesure d'imprimer de JAX-RS 2 JSON charge utile à partir de la demande, indépendamment de la mise en œuvre effective sur mon serveur d'application.
J'ai essayé les solutions proposées sur DONC, mais tous les fichiers binaires à partir de la réalité de la mise en œuvre (comme Jersey et similaires), et je suis autorisé à utiliser uniquement javaee-api v 7.0 dans mon application.
J'ai essayé de la mise en œuvre de ClientRequestFilter et ClientResponseFilter sur mon Client, mais ils ne contiennent pas de sérialisé entités.
Voici un exemple de client:
WebTarget target = ClientBuilder.newClient().register(MyLoggingFilter.class).target("http://localhost:8080/loggingtest/resources/accounts");
Account acc = target.request().accept(MediaType.APPLICATION_JSON).get(account.Account.class);
Et voici la mise en œuvre de MyLoggingFilter:
@Provider
public class MyLoggingFilter implements ClientRequestFilter, ClientResponseFilter {
private static final Logger LOGGER = Logger.getLogger(MyLoggingFilter.class.getName());
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
LOGGER.log(Level.SEVERE, "Request method: {0}", requestContext.getMethod());
}
@Override
public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
LOGGER.log(Level.SEVERE, "Response status: {0}", responseContext.getStatus());
}
}
Vous devez vous connecter pour publier un commentaire.
Donc, il ya un couple de choses à considérer lorsque vous essayez de mettre en œuvre cette
Pour la demande de l'entité, vous voulez la sérialisation à manipuler par le cadre, ce qui signifie que vous ne pas voulez faire quelque chose comme
Ici, vous êtes à la sérialisation de vous-même, peut-être à l'aide de Jackson
ObjectMapper
ou quelque chose. Vous pourrait faire de cette façon, mais c'est un peu limitée dans les types qu'il peut gérer. Si vous laissez l'objet sérialisé la façon dont il est déjà géré par le cadre, le cadre sera en mesure de soutenir plus que juste JSON.De laisser le cadre de poignée de la sérialisation, et encore être en mesure d'obtenir des données sérialisées, nous avons besoin d'utiliser un
WriterInterceptor
. Ce que nous pouvons faire est de définir l'entité flux de sortie pour unByteArrayOutputStream
, puis laissez-le cadre de sérialiser l'objet de demande de notreByteArrayOutputStream
, puis par la suite du journal de ces octets. C'est la façon dont le MaillotLoggingFilter
gère cela.Pour la réponse, dans notre filtre, nous avons besoin d'extraire les données à partir du flux de la réponse, mais aussi nous devons nous assurer que le flux a encore de données, car il n'a pas été désérialisé encore pour le client. Pour ce faire
mark()
etreset()
le flux, en supposant que le marquage est pris en charge. Si non, de l'envelopper dans unBufferedOutputStream
. Encore une fois, c'est la façon dont le MaillotLoggingFilter
gère cela.Trouverez ci-dessous une mise en œuvre simple. La plupart des il est pris directement à partir de la Jersey
LoggingFilter
, mais il est dépouillé juste pour votre cas d'utilisation. Le MaillotLoggingFilter
journaux beaucoup d'autres informations, en dehors de la juste de l'entité. Une chose que j'ai laissé de côté est de la vérification pour le jeu de caractères. J'ai juste utilisé un dur codé en UTF-8, comme leMessageUtil
classe utilisée par Jersey, Jersey est spécifique. Si vous souhaitez faire le filtre le plus universel pour les autres jeux de caractères, vous voudrez peut-être chercher dans la fixation de la.Voir Aussi:
LoggingFilter
EntityLoggingFilter
- je obtenir un NullPointerException surResponse response = target.request(MediaType.APPLICATION_JSON).post(Entity.json(path));
. Est-il une raison évidente pour laquelle le passage d'un sous-classe ne marcherait pas? Il n'est même pas appeler mon constructeur de sous-classe, et les NPE se passe àat org.jboss.resteasy.core.ConstructorInjectorImpl.<init>(ConstructorInjectorImpl.java:45) [resteasy-jaxrs-3.0.10.Final.jar:]