如何处理 Jersey JAX-RS 中的无效数据类型错误
How to Handle Invalid DataType Error in Jersey JAX-RS
我正在研究 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 数据映射到 POJO 时,内部处理似乎抛出了异常。
如果仔细查看日志,您会发现在处理数据时出现 InvalidFormatException
或 JsonMappingException
之类的错误。
您可以为收到的错误创建异常映射器。我建议使用 super JsonMappingException
因为它会处理无效类型、请求有效负载中的无效 JSON 等错误:
@Provider
public class GenericExceptionMapper extends Throwable implements ExceptionMapper<JsonMappingException> {
@Override
public Response toResponse(JsonMappingException thrExe) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("errorMessage", "Invalid input provided");
return Response.status(400).entity(jsonObject.toString())
.type("application/json").build();
}
}
我正在研究 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 数据映射到 POJO 时,内部处理似乎抛出了异常。
如果仔细查看日志,您会发现在处理数据时出现 InvalidFormatException
或 JsonMappingException
之类的错误。
您可以为收到的错误创建异常映射器。我建议使用 super JsonMappingException
因为它会处理无效类型、请求有效负载中的无效 JSON 等错误:
@Provider
public class GenericExceptionMapper extends Throwable implements ExceptionMapper<JsonMappingException> {
@Override
public Response toResponse(JsonMappingException thrExe) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("errorMessage", "Invalid input provided");
return Response.status(400).entity(jsonObject.toString())
.type("application/json").build();
}
}