相关疑难解决方法(0)

Jersey的自定义ExceptionMapper不适用于无效的JSON输入

我有以下资源消耗了映射到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> …
Run Code Online (Sandbox Code Playgroud)

json jax-rs jersey jackson

7
推荐指数
1
解决办法
1261
查看次数

如何将 JSON 解析相关错误映射到球衣中的 json 响应

我定义了一个数据类型及其 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

{ "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"])
Run Code Online (Sandbox Code Playgroud)

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

@Provider …
Run Code Online (Sandbox Code Playgroud)

java rest error-handling jersey-2.0 exceptionmapper

6
推荐指数
1
解决办法
8953
查看次数

如何从REST端点捕获JsonParseException

我有一个这样的端点:

@POST
public Response update(MyDocument myDocument){}
Run Code Online (Sandbox Code Playgroud)

如果请求无效,我的服务器将获得一些较长的日志,如下所示:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: com.fasterxml.jackson.core.JsonParseException: Unexpected character....
...
Caused by...
...
Caused by...
Run Code Online (Sandbox Code Playgroud)

很难完全避免该异常,所以我想知道如何捕获JsonParseException?

jersey jackson jackson-databind

2
推荐指数
1
解决办法
473
查看次数