首页 > 解决方案 > 请求正文为空的 PATCH API - AssertionFailedError:预期为 204 但为 415

问题描述

我们的团队正在开发一个 API,它有一个 PATCH 端点,它有一个空响应和一个空请求主体——必要的信息在路径参数中携带。不是我做的,只是试图让测试运行。

当我尝试测试它时,我得到 415 响应而不是预期的 204。这是我的测试主体:

WebTarget webTarget = ClientBuilder.newClient().target(baseUrl).path(path);
// have also tried this:
// WebTarget webTarget = ClientBuilder.newClient().register(new JacksonJsonProvider()).target(baseUrl).path(path);

webTarget.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);

Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

try {
  final Response response = invocationBuilder.method("PATCH", Entity.json(objectMapper.writeValueAsString(new Object())));

  assertEquals(204, response.getStatus(), "should return 204 empty response");
} catch (JsonProcessingException ex) {
  fail();
}

有趣的是,以下两行本身也返回 415 状态:

Invocation.Builder invocationBuilder webTarget.request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.method("PATCH");

我在控制台中看到以下错误:

ERROR org.apache.cxf.jaxrs.utils.JAXRSUtils - No message body reader has been found for class java.lang.Object, ContentType: application/json

标签: javajunitjacksonjax-rs

解决方案


所以事实证明这是我定义端点的方式 - 这个注释导致了问题:

@RequestBody() final Object updateRequest

完全删除它或将其更改为 String 类型都可以消除错误。

显然我有很多关于 jaxrs 的知识要学:-(


推荐阅读