标签: exceptionmapper

泽西岛无法抓住任何杰克逊的例外

对于我的REST api,我使用jersey和ExceptionMapper来捕获全局异常.它适用于我的应用程序抛出的所有异常,但我无法捕获杰克逊抛出的异常.

例如,我的一个端点接受包含枚举的对象.如果请求中的Json有一个不在enum jersey中的值,则返回此异常

Can not construct instance of my.package.MyEnum from String value 'HELLO': value not one of declared Enum instance names: [TEST, TEST2]
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@5922e236; line: 3, column: 1] (through reference chain: java.util.HashSet[0]->....)
Run Code Online (Sandbox Code Playgroud)

即使我已经创建了这个映射器

@Provider
@Component
public class JacksonExceptionMapper implements ExceptionMapper<JsonMappingException> {
  @Override
  public Response toResponse(JsonMappingException e) {
    ....
  }
}
Run Code Online (Sandbox Code Playgroud)

代码永远不会到达此映射器.

为了捕捉这些例外,我们还需要做些什么吗?

编辑 注意:我有jus尝试不太通用而不是JsonMappingException我使用InvalidFormatException在这种情况下调用映射器.但我仍然不明白,因为InvalidFormatException扩展了JsonMappingException,也应该被调用

json exception jersey jackson exceptionmapper

8
推荐指数
2
解决办法
2101
查看次数

如何将 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
查看次数

JAX-RS 异常处理和 ExceptionMapper

我已经实现了一些自定义异常,如:NotFoundException、BadRequestException、

对于它们中的每一个,我都实现了自己的 ExceptionMapper 像NotFoundExceptionMapper、BadRequestExceptionMapper以及类似GenericExceptionMapper 的东西:

@Provider
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {


    @Override
    @Produces( {MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON} )
    public Response toResponse(Throwable ex) {
        ErrorResponseWrapper errorResponse = new ErrorResponseWrapper(ex.getMessage(), 500, "");
        return Response.status(Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build();
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,这里的问题是GenericExceptionMapper不能像我预期的那样工作,它没有捕获 JAX-RS 抛出的通用异常,因为我认为每个要被此类 Mapper 捕获的异常必须尽早从getResource() throws 之类的方法中显式抛出 一些异常{

此外,该问题是,在RestEasy的我需要在登记例外映射器web.xm。见下文:

 <!-- Custom exception handling provider -->
    <context-param>
        <param-name>resteasy.providers</param-name>
        <param-value>pl.salonea.jaxrs.exceptions.GenericExceptionMapper</param-value>
    </context-param>
Run Code Online (Sandbox Code Playgroud)

这是另一个问题,因为我无法注册(或者我不知道如何注册)我定义的每个自定义 ExceptionMapper。我只能注册单个自定义 ExceptionMapper。 如何全部注册?即 NotFoundExceptionMapper、BadRequestExceptionMapper 等。

所以现在每个异常只由通用异常映射器映射,这是第一个问题。

这是 RESTEasy 的限制吗?在泽西岛的一些教程中,我没有看到需要注册此类 ExceptionMapper,但我也不知道是否可以有多个异常 Mapper。

我想到的另一个解决方案(解决方法)是使用单个 GenericExceptionMapper …

java exception-handling jax-rs exceptionmapper

5
推荐指数
0
解决办法
1285
查看次数

Jersey ExceptionMapper未被调用

我试图调用此异常映射器返回404未找到的响应,但它一直返回500内部错误.泽西版是2.22.1.下面的代码片段.感谢所有帮助.

谢谢.

异常映射器类.

package org.learn.rest.messengerdemo.exception;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class DataNotFoundExceptionMapper implements  ExceptionMapper<DataNotFoundException>{

    @Override
    public Response toResponse(DataNotFoundException ex) {
        return Response.status(Response.Status.FORBIDDEN).build();
    }
}
Run Code Online (Sandbox Code Playgroud)

例外类.

package org.learn.rest.messengerdemo.exception;

public class DataNotFoundException extends RuntimeException{

    private static final long serialVersionUID = 2176642539344388961L;

    public DataNotFoundException(String message)
    {
        super(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

服务类抛出的方法.

public Message getMessage(long messageId) {
    Message message =  messages.get(messageId);
    if(message == null)
    {
        throw new DataNotFoundException("Message with id " + messageId + " not found");
    }
    return message; …
Run Code Online (Sandbox Code Playgroud)

java jersey exceptionmapper

5
推荐指数
1
解决办法
3824
查看次数

捕捉任何异常杰克逊抛出一个ExceptionMapper

我有一个JAX-RS项目,它使用Jackson来处理JSON转换.

当Jackson抛出异常时,它会自动返回带有错误描述的字符串.

因为我想返回一个自定义JSON对象,所以我创建了一个ExceptionMapper.

问题是,当我确切地指定抛出的Exception的类型时,它只捕获异常.

例如,当发送给方法的JSON包含未知属性时,这适用:

public class MyExceptionMapper implements ExceptionMapper<UnrecognizedPropertyException>
Run Code Online (Sandbox Code Playgroud)

但是,如果我UnrecognizedPropertyException改为PropertyBindingException(第一个扩展),它将无法工作.

简而言之:

如何创建一个通用异常映射器来捕获Jackson(或我的应用程序的任何其他组件)抛出的任何异常?

java exception jax-rs jackson exceptionmapper

5
推荐指数
1
解决办法
395
查看次数

ExceptionMapper在grizzly中不起作用

抱歉我的英语不好.我正在使用灰熊和球衣来构建一个Web应用程序.

我这样实施

        ErrorModel errorModel = new ErrorModel("1", "1", "1");
        WebApplicationException applicationException = (WebApplicationException) exception;
        return Response.status(applicationException.getResponse().getStatus()).type(MediaType.APPLICATION_JSON_TYPE).entity(errorModel).build();
Run Code Online (Sandbox Code Playgroud)

当我访问一个不存在的页面时.我发现它抛出一个WebApplicationException.所以我调试并发现正在调用此方法并返回上面的响应.但最后http响应是一个由grizzly构建的html页面.我该怎么办

java jax-rs jersey grizzly exceptionmapper

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

Jersey测试 - 不调用ExceptionMapper

我有REST网络服务,我用Jersey Test,Mockito,Junit测试.成功执行Web服务方法后,我得到正确的响应.如果数据无效,则抛出自定义异常,必须由ExceptionMapper处理.它应该返回相同的结构响应,但具有不同的代码.ExceptionMapper在非测试环境中运行良好.但是,测试执行日志显示后:

1 < 500
1 < Connection: close
1 < Content-Length: 1033
1 < Content-Type: text/html;charset=ISO-8859-1
1 < Date: Wed, 30 Mar 2016 11:55:37 GMT

javax.ws.rs.InternalServerErrorException: HTTP 500 Request failed.
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1020)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:816)
at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:92)
Run Code Online (Sandbox Code Playgroud)

我用:

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>2.22.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

缩短版的模拟服务,由测试类扩展:

public class MockedService extends JerseyTest {

    @Override
    public ResourceConfig configure() {

        forceSet(TestProperties.CONTAINER_PORT, "8080");
        enable(TestProperties.LOG_TRAFFIC);

        return new ResourceConfig().register(new Service());
    }
}
Run Code Online (Sandbox Code Playgroud)

如何从ExceptionMapper获取响应?

junit jersey mockito exceptionmapper jersey-test-framework

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