使用 Grizzly servlet 容器允许带有消息正文的 DELETE 请求

Allow DELETE requests with message body, using Grizzly servlet container

我正在通过 Postman 测试我的 REST API,有一些虚拟请求,我注意到当 DELETE 请求不小心有一个消息正文时,服务器总是 return 状态代码 400(并且没有消息)。我知道 GET 和 DELETE 请求不应该有负载,但我更愿意忽略消息正文,或者我可以 return 我的自定义错误消息 ContainerRequestFilter。 (Bad Request 在我可以使用 RequestFilter 解析请求之前被 returned)

奇怪的是,我已经将 Grizzly 配置为使用 server.getServerConfiguration().setAllowPayloadForUndefinedHttpMethods(true); 允许这样做(在启动服务器之前),据我所知,在过去这行得通。我不确定发生了什么变化......我仍然在我的 parent pom.xml:

中使用 Jersey 的这种依赖
  <dependency>
    <groupId>org.glassfish.jersey</groupId>
    <artifactId>jersey-bom</artifactId>
    <version>${jersey.version}</version>
    <type>pom</type>
    <scope>import</scope>
  </dependency>

<jersey.version>2.23.1</jersey.version> 并在 child 模块中:

<dependency>
  <groupId>org.glassfish.jersey.containers</groupId>
  <artifactId>jersey-container-grizzly2-http</artifactId>
</dependency>

我已经搜索了我的项目,但我没有触及 ServerConfiguration 其他任何地方。

我更换了 JSON 供应商,也许这与它有关?我从 Grizzly 默认的 Moxy 转到了自定义的 Jackson JSON 提供程序。如果需要,我可以显示自定义 JacksonJaxbJsonProvider。什么可以在这里覆盖 setAllowPayloadForUndefinedHttpMethods(true)

创建服务器时,需要以不会立即启动的方式创建,否则无法配置。为此,只需使用 GrizzlyHttpServerFactory.createHttpServer(...) 的重载,它允许您将 boolean 作为最后一个参数传递。值 false 告诉服务器不要立即启动。

HttpServer server = GrizzlyHttpServerFactory.createHttpServer(
                           URI.create(BASE_URI), resourceConfig, false);
server.getServerConfiguration().setAllowPayloadForUndefinedHttpMethods(true);
server.start();