Как исправить предупреждение о параметрах запроса POST в Джерси?

Я создаю очень простой REST API с помощью Jersey, и в моих файлах журнала есть предупреждение, в котором я не уверен.

ПРЕДУПРЕЖДЕНИЕ: запрос POST сервлета к URI http://myserver/mycontext/myapi/users/12345?action=delete, содержит параметры формы в теле запроса, но тело запроса было использовано сервлетом или фильтром сервлета, обращающимся к параметрам запроса. Только методы ресурсов, использующие @FormParam, будут работать должным образом. Методы ресурсов, использующие тело запроса другими способами, не будут работать должным образом.

В моем веб-приложении определен только сервлет Джерси, сопоставленный с / myapi / *

Как я могу отключить эти предупреждения?


person brabster    schedule 06.01.2010    source источник
comment
Я ответил на этот вопрос здесь ‹stackoverflow.com/a/23994132/616550 ›. Надеюсь, это поможет!   -  person David Fdez.    schedule 02.06.2014
comment
Отсутствие предупреждения не означает, что вы устранили проблему, стоящую за ним.   -  person Dragas    schedule 12.09.2018
comment
Если вы используете Spring Boot, вот другой обходной путь   -  person Paul Samsotha    schedule 03.11.2018


Ответы (9)


Для меня предупреждение отображалось для приложения POST / x-www-form-urlencoded. И я использую Spring Boot, у которого есть HiddenHttpMethodFilter, который выполняет getParameter прежде всего ... Итак, я закончил тем, что сделал это неприятное переопределение:

@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);
                }
            }
        };
    }
person javo    schedule 25.05.2016
comment
Решил и свои проблемы! (Это очень особенная (глупая) установка, которая привела нас к этой проблеме, или почему другие люди не сталкиваются с этой проблемой?!? - person Andreas Lundgren; 16.09.2016
comment
Я получаю эту ошибку при использовании Jersey MVC. Если я перейду на Spring MVC, в этом переопределении нет необходимости. - person Andreas Lundgren; 16.09.2016
comment
Если вам вообще не нужен HiddenHttpMethodFilter, вы можете отключить его. См. здесь, как это сделать! - person Jacob van Lingen; 07.06.2017

Это сообщение предназначено для предупреждения разработчиков о том, что тело объекта запроса было использовано, поэтому любые другие попытки прочитать тело сообщения потерпят неудачу.

Это сообщение можно проигнорировать или отфильтровать из журналов:

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;
    }
});
person Iulian Ghionoiu    schedule 08.07.2014
comment
Его следует разместить где-нибудь в части инициализации вашего приложения, прежде чем вы начнете обслуживать запросы. - person Iulian Ghionoiu; 16.10.2014
comment
Я считаю, что вам следует попытаться решить проблему, а не скрывать ее. Мои 2 цента (я тоже могу ошибаться). - person facundofarias; 29.01.2015
comment
Почему это можно игнорировать !? Это явно проблема, поскольку ваш код этого не понимает ... Если вы ожидаете что-то сделать с данными, у вас явно есть проблема. Не игнорируйте это .... @facundofarias прав. Закапывать голову в песок и делать вид, что у тебя нет проблем, - глупо. - person nterry; 16.04.2016
comment
Имеет смысл игнорировать сценарий общедоступного API, когда вы не можете контролировать забавные вещи, которые ваши потребители API могут делать при работе над своей интеграцией, и у вас их слишком много, чтобы справиться с шумом журнала. - person kylejmcintyre; 06.04.2018

Следующая ветка описывает получаемое вами предупреждение. Похоже, у вас может быть фильтр, определенный в вашем web.xml, который обрабатывает запрос до того, как это сделает Джерси.

person Alex Winston    schedule 21.05.2010
comment
Это обязательно плохо? Есть ли способ просто скрыть вывод консоли / журнала? - person bobber205; 08.08.2012

У меня только что для моей ajax-функции в JQuery было установлено значение contentType: "application/x-www-form-urlencoded; charset=UTF-8", потому что с предыдущим решением (без Джерси) у меня были некоторые проблемы с кодированием. Когда я удалил это сообщение, все работало нормально.

person cljk    schedule 30.07.2013

Наконец, избавился от этого, убедившись, что у меня в заголовках запроса есть Content-Type: application / json (очевидно, на стороне клиента)

person Arnold B.    schedule 10.11.2015
comment
Было бы лучше, если бы вы могли объяснить почему нам это нужно вместо application/x-www-form-urlencoded. - person Stewart; 09.06.2017

Это предупреждение - единственное, что регистрирует WebComponent, поэтому просто включите ведение журнала до уровня ОШИБКИ или отключите ведение журнала для этого компонента в файле logback.xml или там, где вы настроили ведение журнала. Вам не нужно писать настраиваемый фильтр, чтобы игнорировать это конкретное сообщение, так как другие сообщения этого компонента не регистрируются.

Фрагмент исходного кода из org.glassfish.jersey.servlet.WebComponent версии 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()));
            }
        }

Локализованное сообщение, которое используется для этого предупреждающего сообщения:

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.

Отключите выход для WebComponent в файле logback.xml следующим образом:

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

Верно. Итак, у меня возникла эта проблема, и я пытался решить ее разными способами, но я не хотел изменять свои настройки web.xml просто потому, что если бы я тестировал свое приложение с помощью Postman, он работал отлично, но когда он интегрируется с веб-приложением, он не справляется с упомянутой проблемой (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.)

Итак, как упоминалось в @clijk, вам нужно только установить свои заголовки как:

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

и вуаля, предупреждение исчезло.

Спасибо

person facundofarias    schedule 29.01.2015

В моем случае я исправил эту ошибку, когда изменил Дата объекта на Строку в методе.

Ошибка:

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

Фиксированный

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

Поместите это в свою подпись ресурса. Или найдите эту строку в своем проекте, кто-то уже использовал ее, если используется @PUT или @POST. Это должно помочь

import javax.ws.rs.Consumes;

@Consumes(MediaType.APPLICATION_JSON)
person Johnny Cage    schedule 21.10.2019