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?

31
demandé sur brabster 2010-01-06 12:14:04

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;
    }
});
8
répondu Iulian Ghionoiu 2014-07-08 14:26:05

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);
                }
            }
        };
    }
8
répondu javo 2016-05-25 11:05:57

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.

5
répondu Alex Winston 2010-05-21 18:28:00

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.

3
répondu cljk 2013-07-30 14:05:38

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)

3
répondu Arnold B. 2015-11-10 17:52:04

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"/>
2
répondu afenkner 2015-02-17 15:31:46

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

1
répondu facundofarias 2015-01-29 13:58:36

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 {
0
répondu ferreirabraga 2015-09-25 14:32:59