【发布时间】:2018-09-05 05:36:01
【问题描述】:
我正在开发 JAX-RS API,用户将以下 JSON 有效负载发送到我的 API:
{
"text": "test search",
"count": "myvalue"
}
如上所述,count 是 POJO SearchDetailsInfo.java 中的 Integer 类型,但用户在向此 API 发布数据时会在其中发送一些垃圾字符串。
请在下面找到我的控制器方法:
@POST
@Path("/myview")
@Produces(MediaType.APPLICATION_JSON)
public OrderedJSONObject getCatalogView(SearchDetailsInfo criteria,
@Context ContainerRequestContext containerRequestContext) {
.... processing ....
}
由于数据类型不匹配,API 得到如下响应错误:
Status Code : 400
Status Message : Bad Request
Body:
Can not construct instance of java.lang.Integer from String value 'myvalue':
not a valid Integer value at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@bd8b3db; line: 5, column: 15]
由于数据类型不匹配,Jersey 抛出无效数据类型错误。
不幸的是,我无法捕捉到这个异常,因为由于数据类型解析中的异常,请求没有进入控制器方法。
想知道,我怎样才能捕捉到这个异常,以便我可以将错误响应更改为有意义的东西。
谢谢。
【问题讨论】:
-
您使用的是什么 JSON 提供程序?
-
我正在使用
jersey-media-json-jackson作为它的球衣项目 -
您可以创建
ExceptionMapper<JsonMappingException>和ExceptionMapper<JsonParseException>(是的,两者都有)并注册它们。在这些映射器中返回您想要的任何内容。 -
见the Jackson one,他们所做的只是返回异常消息。这就是您目前所看到的。
-
嗨,保罗,感谢您的回复。创建类
JsonMappingExceptionMapper并扩展到ExceptionMapper会起作用吗?还是我也需要挂接到应用程序?
标签: jax-rs jersey-2.0 jsonparser