web-dev-qa-db-fra.com

Comment réparer Jersey POST demande de paramètres warning?

Je suis en train de construire une API REST très simple à l'aide de Jersey et des fichiers journaux contenant un avertissement dont je ne suis pas sûr.

AVERTISSEMENT: Une demande de servlet POST, à l'URI http: // myserver/mycontext/myapi/users/12345? action = delete , contient des paramètres de formulaire dans le fichier corps de la requête mais le corps de la requête a été consommé par le servlet ou un filtre de servlet accédant à la requête paramètres. Seules les méthodes de ressources utiliser @FormParam fonctionnera comme attendu. Méthodes de ressources consommant le corps de la requête par d'autres moyens sera ne fonctionne pas comme prévu.

Ma webapp n'a que le servlet Jersey défini, mappé sur/myapi/*

Comment puis-je arrêter ces avertissements?

35
brabster

Pour moi, l'avertissement était affiché pour POST application/x-www-form-urlencoded. Et j'utilise Spring Boot qui a un HiddenHttpMethodFilter qui fait un getParameter avant toute chose ... Alors j'ai fini par faire cette méchante substitution:

@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);
                }
            }
        };
    }
11
javo

Ce message est destiné à avertir les développeurs du fait que le corps de l'entité de demande a été utilisé. Par conséquent, toute autre tentative de lecture du corps du message échouera.

Il est prudent d’ignorer le message ou de le filtrer 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;
    }
});
10
Iulian Ghionoiu

Le thread suivant décrit l’avertissement que vous recevez. Il semble qu'un filtre défini dans votre fichier web.xml traite la demande avant Jersey.

6
Alex Winston

Enfin débarrassé de cela en m'assurant d'avoir Content-Type: application/json dans les en-têtes de ma demande (évidemment du côté client)

3
Arnold B.

Je venais de régler ma fonction ajax dans JQuery sur contentType: "application/x-www-form-urlencoded; charset=UTF-8" car avec une solution antérieure (sans Jersey), j'avais quelques problèmes d’encodage. Quand j'ai enlevé ça, le message était parti et tout fonctionnait bien.

3
cljk

Cet avertissement est la seule chose que WebComponent enregistre. Il suffit donc d'activer la journalisation au niveau ERROR ou de désactiver la journalisation pour ce composant dans votre fichier logback.xml ou à tout autre emplacement de la journalisation configuré. Vous n'avez pas besoin d'écrire un filtre personnalisé pour ignorer ce message spécifique car aucun autre message n'a été enregistré à partir de ce composant.

Extrait de 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()));
            }
        }

Le message localisé 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 déconnexion du composant Web dans votre fichier logback.xml, comme suit:

<logger name="org.glassfish.jersey.servlet.WebComponent" level="OFF" additivity="false"/>
2
afenkner

Droite. J'ai donc eu ce problème et j'ai essayé de le résoudre de différentes manières, mais je ne voulais pas changer mes paramètres web.xml, simplement parce que si je testais mon application avec Postman, fonctionnait parfaitement, mais lorsqu’elle était intégrée à la webapp, le problème mentionné échouait (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.)

Donc, comme @clijk l'a mentionné, il vous suffit de définir vos en-têtes comme suit:

"Content-Type":"application/json"
"charset":"UTF-8"

et voila, l'avertissement c'est parti.

Merci

1
facundofarias

Dans mon cas, j'ai corrigé cette erreur lorsque j'ai changé l'objet Date en String dans la méthode. 

Erreur:

@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") Date date) throws Exception {

Fixé

@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") String date) throws Exception {
0
ferreirabraga