【发布时间】:2017-03-21 04:09:49
【问题描述】:
我有以下资源消耗被映射到 POJO 的 JSON。
@Path("example")
public class ExampleResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addThesis(MyObject myObject) {
return Response.ok().entity("Test").build();
}
}
这是 POJO 类:
public class MyObject {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
当我发送一个带有 {"title":"Test title"} 正文的 POST 请求时,一切正常。正如预期的那样,响应是Test。但是,当我将请求更改为 {"titlee":"Test title"} 时,服务器会回复:
无法识别的字段“titlee”(com.my.package.MyObject 类),未标记为可忽略(一个已知属性:“title”]) 在 [来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@6dc6a46a; line: 2, column: 11](通过引用链:com.my.package.MyObject["titlee"])
显然这是 Jersey 抛出并返回的异常。如何拦截此异常并返回自定义状态码和消息?
到目前为止,我尝试的是实现我自己的 ExceptionMapper:
@Provider
public class MyJsonExceptionMapper implements ExceptionMapper<JsonProcessingException> {
public Response toResponse(JsonProcessingException e) {
return Response.status(400).entity("JSON Processing Error").build();
}
}
不幸的是,响应保持不变。当我为自定义异常实现 ExceptionMapper 并在资源方法中抛出相应的异常时,一切正常。我认为这与覆盖我自己的 JsonProcessingException 的默认 ExceptionMapper 有关。然后我尝试创建一个通用映射器(“implements ExceptionMapper”),但还是没有成功。
我到处寻找并尝试了很多方法,包括扩展 ResourceConfig 和注册我的映射器,但到目前为止没有任何效果。
更多信息可能有助于缩小问题范围:我使用 Grizzly2 作为 HTTP 服务器,我将其部署为 Fat JAR。
我的 pom.xml 的依赖部分如下所示:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.24</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
<version>2.24</version>
</dependency>
</dependencies>
非常感谢任何建议。
【问题讨论】:
-
据我记得我认为为 JsonMappingException 和 JsonParseException 实现映射器,应该覆盖默认的映射器。我不太确定如何禁用它们。
-
为
Throwable实现映射器应该覆盖/all/ 现有的映射器。但这似乎不起作用。也不会在 ResourceConfig 中明确重新注册ExceptionMapper<JsonMappingException>。 -
(同时按照文档建议实现
ExtendedExceptionMapper也不起作用...)
标签: json jersey jackson jax-rs