5

我定义了一个数据类型及其 API:

public class DataType {
    @Column
    private String name;
}

// API is:
public class DataTypeAPI {
    @POST
    @Path("/")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @ManagedAsync
    public void createDataType(
            final DataType dataType,
    ) {
        ...
        asyncResponse.resume(Response.status(Response.Status.CREATED)
                .entity(dataType)
                .build());
    }
}

{ "name": "xxx" }如果我摆姿势一切都很好

但是当我发布时{ "name1": "xxx" },我得到了以下text/plain回复:

Unrecognized field "name1" (class com.xxx.datatypes.DataType), not marked as ignorable (1 known properties: "name"])
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@526e34b1; line: 2, column: 15] (through reference chain: com.xxx.datatypes.DataType["name1"])

我更喜欢将上述错误转换为 JSON 响应。但是事件我添加了以下异常映射器,它没有返回 JSON 响应。

@Provider

public class GenericExceptionMapper implements ExceptionMapper<Throwable> {
    public Response toResponse(Throwable ex) {
        System.out.println("GenericExceptionMapper");
        ex.printStackTrace();
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                .entity(new ErrorBody(500, ex.getMessage()))
                .type(MediaType.APPLICATION_JSON)
                .build();
    }
}

为什么我上面的异常映射器无法捕获球衣解析错误。有人可以向我解释吗?谢谢

更新

我有两个问题:

1、如何做出响应来application/json代替text/plain

2、为什么我的异常映射器没有捕捉到引发的异常并将其映射到json响应?

更新

我添加了以下映射器:

public class JsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> {
    public Response toResponse(JsonMappingException ex) {
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                .entity(new ErrorBody(500, ex.getMessage()))
                .type(MediaType.APPLICATION_JSON)
                .build();
    }
}

现在,我可以得到 json 响应: { "code": 500, "message": "Unrecognized field \"name1\" (class com.xxx.datatypes.DataType), not marked as ignorable (1 known properties: \"name\"])\n at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@1d8cd12a; line: 2, column: 15] (through reference chain: class com.xxx.datatypes.DataType[\"name1\"])" }

我还有两个问题:

1、为什么我的通用异常映射器无法捕获它。

2、 json映射异常映射器贴出无法映射如下异常(逗号,添加测试用)Unexpected character ('}' (code 125)): was expecting double-quote to start field name at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@7615743c; line: 3, column: 2]{"name": "xxxx",}

4

3 回答 3

1

为什么我的通用异常映射器无法捕获它。

因为 Jackson-JAXRS 模块已经带有ExceptionMappers for Jackson exceptions

json映射异常映射器无法映射如下异常

我没有对此进行测试,但这很可能是因为它不是映射异常,而是解析异常。杰克逊同时拥有JsonParseExceptionJsonMappingException。您可以在上一个链接中看到 Jackson 为JsonMappingException和提供了一个 ExceptionMapper JsonParseException。您只是覆盖映射器JsonMappingException

于 2018-01-30T20:51:09.763 回答
1

我遇到了同样的问题,我已经解决了。我试着解释一下你的问题:</p>

两者JsonMappingExceptionJsonParseException扩展JsonProcessingException。泽西岛已经定义JsonMappingExceptionMapper了 forJsonMappingExceptionJsonParseExceptionMapperfor JsonParseException

  1. 如果为JsonProcessingException(或更广泛的异常映射器)定义自己的映射器,它无法捕获JsonMappingExceptionand JsonParseException,因为这两个异常都有自己的映射器。如果他们没有,您的映射器可以捕获。
  2. 如果您定义自己的映射器(例如XxxJsonMappingExceptionMapperforJsonMappingExceptionYyyJsonParseExceptionMapperfor JsonParseException),您可能会发现有时您可以捕获这些异常,有时则不能,这取决于您自己的映射器是否正常工作或球衣的映射器是否正常工作。现在,您可以将@Priority(1)(javax.annotation.Priority) 添加到您的映射器以确保您的映射器正常工作。 请参阅Jackson JsonParseExceptionMapper 和 JsonMappingExceptionMapper 阴影自定义映射器

回到你的问题:

  1. 您的通用异常映射器无法捕获它,因为这些异常有自己的异常映射器(JsonMappingExceptionMapper并且JsonParseExceptionMapper它们具有更高的优先级)。
  2. 您可能无法捕获异常,因为您自己的映射器被JsonParseExceptionMapper. @Priority(1)尝试通过添加到您自己的映射器来弄清楚
于 2020-12-11T10:17:48.077 回答
0

无法识别的字段“name1”(com.xxx.datatypes.DataType 类),未标记为可忽略(1 个已知属性:“name”])

如果您查看引发的异常,很明显,您的 POJO 类具有名称为namenot的属性name1

而且,您正在尝试使用属性 name 发布您的 JSON name1

{ "name1": "xxx" }

而且,它没有被识别为name1没有定义name

public class DataType {
    @Column
    private String name;
}

这就是原因,在其他情况下,当您将 JSON 发布为

{ "name": "xxx" }
于 2018-01-30T17:10:31.363 回答