Comment corriger Jersey Post avertissement de paramètres de requête?
je construis une API REST très simple en utilisant Jersey, et j'ai un avertissement dans mes fichiers journaux que je ne suis pas sûr.
avertissement: une requête de POST de servlet, à URI http://myserver/mycontext/myapi/users/12345?action=delete, contient les paramètres de forme demande de corps, mais le corps de la requête a été consommés par la servlet ou un servlet filter accédant à la demande paramètre. Seule ressource méthodes utiliser @FormParam fonctionnera comme suit: devrait. Ressources méthodes de consommer le corps de la requête par d'autres moyens ne pas fonctionner comme prévu.
Ma webapp seulement le Maillot de servlet défini, associé à /myapi/*
Comment puis-je arrêter ces avertissements?
8 réponses
ce message est destiné à avertir les développeurs du fait que le corps de l'entity request a été consommé, donc toute autre tentative de lire le corps du message échouera.
Il est sûr d'ignorer le message ou le filtre de l'un des journaux:
java.util.logging.Logger jerseyLogger =
java.util.logging.Logger.getLogger(WebComponent.class.getName());
jerseyLogger.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
boolean isLoggable = true;
if (record.getMessage().contains("Only resource methods using @FormParam")) {
isLoggable = false;
}
return isLoggable;
}
});
pour moi l'avertissement était affiché pour POST application/x-www-form-urlencoded. Et j'utilise la botte de ressort qui a un HiddenHttpMethodFilter qui fait un getParameter avant toute autre chose... J'ai donc fini par faire ce méchant remplacer:
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new HiddenHttpMethodFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
if ("POST".equals(request.getMethod())
&& request.getContentType().equals(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
filterChain.doFilter(request, response);
} else {
super.doFilterInternal(request, response, filterChain);
}
}
};
}
La suite thread décrit l'avertissement que vous recevez. Il semble que vous ayez un filtre défini dans votre web.xml qui traite la requête avant Jersey.
je viens d'avoir ma fonction ajax en JQuery réglée à contentType: "application/x-www-form-urlencoded; charset=UTF-8"
parce qu'avec une solution antérieure (sans Jersey) j'ai eu quelques problèmes d'encodage. Quand j'ai enlevé que le message avait disparu et que tout fonctionnait bien.
Enfin débarrassé de cela, assurez-vous j'ai eu Content-Type: application / json dans mon en-têtes de requête (évidemment, sur le côté client)
cet avertissement est la seule chose que le WebComponent enregistre, donc il suffit de monter la journalisation au niveau D'erreur ou de désactiver la journalisation pour ce composant dans votre logback.xml ou partout où vous avez configuré la journalisation. Vous n'avez pas besoin d'écrire un filtre personnalisé pour ignorer ce message puisqu'il n'y a pas d'autres messages enregistrés à partir de ce composant.
extrait du code Source de org.glassfish.Jersey.servlet.WebComponent version 2.14:
if(!form.asMap().isEmpty()) {
containerRequest.setProperty("jersey.config.server.representation.decoded.form", form);
if(LOGGER.isLoggable(Level.WARNING)) {
LOGGER.log(Level.WARNING, LocalizationMessages.FORM_PARAM_CONSUMED(containerRequest.getRequestUri()));
}
}
localisée le message utilisé pour ce message d'avertissement est:
form.param.consumed=A servlet request to the URI {0} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.
désactivez la journalisation pour le Component Web dans votre logback.xml comme ceci:
<logger name="org.glassfish.jersey.servlet.WebComponent" level="OFF" additivity="false"/>
Droite.
Donc j'ai souffert de ce problème, et j'ai essayé de le résoudre de différentes façons, mais je ne voulais pas changer mon web.les paramètres xml, juste parce que si je testais mon application avec Postman il a fonctionné parfait, mais quand il a été intégré avec le webapp il échoue avec la question mentionnée (A servlet request to the URI {MY_URI} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.
)
"Content-Type":"application/json"
"charset":"UTF-8"
et voilá, l'avertissement qu'il a disparu.
Merci
Dans mon cas, j'ai corrigé cette erreur lorsque j'ai changé l'Objet DateChaîne dans la méthode.
Erreur:
@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") Date date) throws Exception {
Fixe
@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") String date) throws Exception {