如何处理 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 时,内部处理似乎抛出了异常。

如果仔细查看日志,您会发现在处理数据时出现 InvalidFormatExceptionJsonMappingException 之类的错误。

您可以为收到的错误创建异常映射器。我建议使用 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();
    }
}