Как исправить предупреждение о параметрах запроса POST Джерси? - PullRequest
36 голосов
/ 06 января 2010

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

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

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

Как я могу остановить эти предупреждения?

Ответы [ 8 ]

12 голосов
/ 25 мая 2016

Для меня выводилось предупреждение для приложения 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);
                }
            }
        };
    }
10 голосов
/ 08 июля 2014

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

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

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;
    }
});
6 голосов
/ 21 мая 2010

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

3 голосов
/ 10 ноября 2015

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

3 голосов
/ 30 июля 2013

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

2 голосов
/ 17 февраля 2015

Это предупреждение - единственное, что регистрирует 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"/>
1 голос
/ 29 января 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"

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

Спасибо

0 голосов
/ 25 сентября 2015

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

Ошибка:

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

Fixed

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