vig*_*num 7 json jax-rs jersey jackson
我有以下资源消耗了映射到POJO的JSON.
@Path("example")
public class ExampleResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addThesis(MyObject myObject) {
return Response.ok().entity("Test").build();
}
}
Run Code Online (Sandbox Code Playgroud)
这是POJO课程:
public class MyObject {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Run Code Online (Sandbox Code Playgroud)
当我发送一个带有正文{"标题":"测试标题"}的POST请求时,一切正常.正如预期的那样,响应是Test.但是,当我将请求更改为{"titlee":"测试标题"}时,服务器会回复:
无法识别的字段"titlee"(类com.my.package.MyObject),未标记为可忽略(一个已知属性:"title"])在[来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@6dc6a46a; line:2,column:11](通过引用链:com.my.package.MyObject ["titlee"])
显然这是泽西投掷和退回的例外.如何拦截此异常并返回自定义状态代码和消息?
到目前为止我尝试过的是实现我自己的ExceptionMapper:
@Provider
public class MyJsonExceptionMapper implements ExceptionMapper<JsonProcessingException> {
public Response toResponse(JsonProcessingException e) {
return Response.status(400).entity("JSON Processing Error").build();
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,响应保持不变.当我为自定义异常实现ExceptionMapper并在资源方法中抛出相应的异常时,一切正常.我假设这与JsonProcessingException的默认ExceptionMapper有关,它覆盖了我自己的.然后我尝试创建一个通用映射器("实现ExceptionMapper"),但再次没有成功.
我看起来到处都是,并尝试了很多东西,包括扩展ResourceConfig和注册我的mapper,但到目前为止还没有任何工作.
一些可能有助于缩小问题的更多信息:我使用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>
Run Code Online (Sandbox Code Playgroud)
任何建议都非常感谢.
好吧,这是愚蠢和黑客,但对我有用:
register(JacksonJaxbJsonProvider.class);
这是由于Jackson功能入口点中的以下"不错的默认行为":
if (!config.isRegistered(JacksonJaxbJsonProvider.class)) {
// add the default Jackson exception mappers
context.register(JsonParseExceptionMapper.class);
context.register(JsonMappingExceptionMapper.class);
:(
但是,我仍然更喜欢能够解决"真实"问题的答案 - 即.没有预先注册组件,以便该功能无法正确配置它们...