2016-01-18 2 views
0

Je suis un newbie Jersey et je dois enregistrer la réponse JSON. Je souhaite prendre l'entité et la convertir en JSON exactement comme fait par le framework Jersey (même mappeur, etc.). Existe-t-il un moyen d'extraire son mapper (et d'appeler, par exemple, son writeValueAsString)?Log Jersey entité comme JSON en réponse

Répondre

0

Vous ne spécifiez pas quel paquet vous utilisez pour produire la réponse JSON (ni vous expliquez beaucoup au sujet de votre serveur jersey), mais je suppose que vous utilisez Jackson. Vous avez un peu de tracing à Jersey, jetez un oeil here, mais aussi fas que je sais, il ne fait pas ce dont vous avez besoin.

Mais d'abord vous devez mettre en œuvre un LoggingFilter,

public class YourLoggingFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) 
      throws IOException { 
     ... 

    } 

} 

Et je suppose que vous étendez la classe ResourceConfig d'ajouter des ressources, vous devez ajouter le nouveau filtre ici:

public class YourApplication extends ResourceConfig { 

    public YourApplication() { 
     super(); 

     register(YourAuthenticationRequestFilter.class, Priorities.AUTHENTICATION); 
     register(YourExceptionMapper.class); 
     register(YourLoggingFilter.class); 

     packages("..."); 
    } 
} 

Et Enfin, un moyen simple d'enregistrer votre réponse à l'intérieur YourLoggingFilter serait (ici je suppose Jackson, mais ce n'est qu'un exemple, je ne sais pas quel enregistreur vous utilisez, mais n'ouvrez pas un fichier chaque fois que vous faites un requ est !!!)

Object obj = responseContext.getEntity(); 
ObjectMapper om = new ObjectMapper(); 
File file = new File("..."); 
try { 
    OutputStream out = new FileOutputStream(file); 
    om.writeValue(out, obj); 
} catch (IOException e) { 
    // this could fail but you don't want your request to fail 
    e.printStackTrace(); 
} 

Espérons que ça aide.

+0

Merci, et fondamentalement j'ai accompli quelque chose de très similaire, mais vous êtes tombé exactement où je suis tombé: en mettant l'accent sur l'implémentation de YourLoggingFilter vous utilisez l'ObjectMapper, mais je souhaite utiliser le même mapper que le Jersey infra. Vous supposez que Jersey l'utilise, mais que se passe-t-il si demain quelqu'un va le changer et que ce code de journalisation utilise encore une implémentation spécifique? spécifiquement, j'ai découvert que la réponse réelle tronque les éléments NULL tout en utilisant ObjectMapper ne le fait pas. Donc, voici une différence. Comment puis-je utiliser le même mappeur que la réponse réelle? – user2339344

+0

Eh bien, vous avez vraiment besoin d'aller dans les entrailles du serveur pour le faire, je suppose .... Au cas où cela vous aide, jetez un oeil à la méthode 'ServerRuntime'' writeResponse', au moins dans ma version, mais il semble sorte de dur, beaucoup d'objets à créer. Je me demande pourquoi vous avez exactement besoin de la même chose, mais cela demande beaucoup d'efforts. D'ailleurs, si vous aviez déjà une solution, même si elle était incomplète, je vous suggérerais de l'afficher avec votre question, de cette façon vous éviterez que quelqu'un ne construise une réponse que vous avez déjà ... dans mon cas, ça n'a pas Prends pas grand chose. De toute façon, seulement une suggestion. À votre santé. – lrnzcig

+0

OK, merci. Je pensais qu'il y avait une façon plus simple d'extraire le «même mappeur que la réponse utilise». Et désolé de vous dérouter, je voulais juste demander le mappeur, en supposant que j'ai le ContainerResponseContext, ne voulait pas induire en erreur que je ne sais pas comment l'obtenir. – user2339344