40

我正在使用 Jersey 构建一个非常简单的 REST API,并且我的日志文件中有一个我不确定的警告。

警告:对 URI http://myserver/mycontext/myapi/users/12345?action=delete的 servlet POST 请求在请求正文中包含表单参数,但请求正文已被 servlet 或 servlet 过滤器访问请求参数。只有使用 @FormParam 的资源方法才能按预期工作。通过其他方式消耗请求正文的资源方法将无法按预期工作。

我的 webapp 只定义了 Jersey servlet,映射到 /myapi/*

我怎样才能停止这些警告?

4

9 回答 9

13

对我来说,警告显示 POST application/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);
                }
            }
        };
    }
于 2016-05-25T11:05:57.827 回答
12

此消息旨在警告开发人员有关请求实体正文已被消耗的事实,因此任何其他读取消息正文的尝试都将失败。

忽略该消息或将其从日志中过滤掉是安全的:

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;
    }
});
于 2014-07-08T14:26:05.360 回答
6

以下线程描述了您收到的警告。听起来好像您可能在 web.xml 中定义了一个过滤器,该过滤器在 Jersey 之前处理请求。

于 2010-05-21T18:28:00.457 回答
4

我刚刚将 JQuery 中的 ajax 函数设置为,contentType: "application/x-www-form-urlencoded; charset=UTF-8"因为使用先前的解决方案(没有 Jersey)我遇到了一些编码问题。当我删除该消息时,一切正常。

于 2013-07-30T14:05:38.427 回答
4

最后通过确保我的请求标头中有Content-Type: application/json来摆脱这个问题(显然,在客户端)

于 2015-11-10T17:52:04.307 回答
2

此警告是 WebComponent 记录的唯一内容,因此只需将日志记录设置为 ERROR 级别或在 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.

在 logback.xml 中关闭 WebComponent 的日志记录,如下所示:

<logger name="org.glassfish.jersey.servlet.WebComponent" level="OFF" additivity="false"/>
于 2015-02-16T22:54:59.123 回答
1

正确的。所以我一直遇到这个问题,我一直在尝试以不同的方式解决它,但我不想更改我的 web.xml 设置,只是因为如果我用 Postman 测试我的应用程序,它工作得很好,但是当它与 webapp 集成时,它会因上述问题而失败(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"

瞧,警告它已经消失了。

谢谢

于 2015-01-29T13:58:36.463 回答
0

把它放到你的资源签名中。或者在你的项目中找到这个字符串,如果使用了@PUT 或@POST,那么有人已经使用了它。这应该有帮助

import javax.ws.rs.Consumes;

@Consumes(MediaType.APPLICATION_JSON)
于 2019-10-21T10:04:50.517 回答
0

在我的情况下,当我在方法中将对象日期更改为字符串时,我已经修复了这个错误。

错误:

@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 {
于 2015-09-25T14:32:59.333 回答