【问题标题】:Handling Jackson Exception处理杰克逊异常
【发布时间】:2023-03-27 19:53:01
【问题描述】:

我有一个使用球衣构建的 Rest,我尝试处理异常。 我使用此类注册了杰克逊如何为所有有关 json 映射的操作的默认 json 处理器:

@javax.ws.rs.ApplicationPath("/")
public class MyApplication extends ResourceConfig {
   public MyApplication() {
       packages("controller");
       register(JacksonFeature.class);       
   }
}

我使用以下类定义了一个异常映射器来捕获一些异常,例如“UnauthorizedException”和“BadRequestException”:

@Provider
public class ClientExceptionMapper implements ExceptionMapper<BaseException>
{
    @Override
    public Response toResponse(BaseException ex) 
    {
        System.out.println("qwertweryt");
        if(ex instanceof UnauthorizedException)
        {
            System.out.println("Unauthorized!");
            return (((UnauthorizedException)ex).getResponse());
        }
        else if(ex instanceof BadrequestException)
        {
            System.out.println("Badrequest!");
            return (((BadrequestException)ex).getResponse());
        }
        return null;
    }
}

其中 BaseException、UnauthorizedException 和 BarequestException 分别是:

public abstract class BaseException extends WebApplicationException
{
    private Response r;

    public BaseException(Response response)
    {
        r = response;
    }

    public Response getResponse()
    {
        return r;
    }
}

public class UnauthorizedException extends BaseException
{
    public UnauthorizedException(Response response)
    {
        super(response);
    }
}

public class BadrequestException extends BaseException
{
    public BadrequestException(Response response)
    {
        super(response);
    }
}

所以,在我处理 jackson 异常之前,一切正常……事实上,我定义了另一个异常映射器,类似于第一个,来处理 jackson 生成的所有异常(例如 JsonMappingException),但不起作用。我向您报告我的应用程序获得的错误:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "serverr" (Class controller.server.control.response.GetServerDetailsResponse), not marked as ignorable
at [Source: org.glassfish.jersey.message.internal.EntityInputStream@701d7463; line: 1, column: 14] (through reference chain: controller.server.control.response.GetServerDetailsResponse["serverr"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)
at org.codehaus.jackson.map.deser.BeanDeserializer._handleUnknown(BeanDeserializer.java:725)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:703)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:181)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:134)
at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:72)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:134)

我的第一个问题是:这可能是两个类发生冲突,即同一个项目中没有两个异常映射器?第二个问题是:我该如何解决这个问题? 我希望我很清楚,并提前感谢您的帮助!

您好,我刚刚阅读了一篇文章,其中提出了与我相同的问题;我向您报告问题的链接:Jersey: Returning 400 error instead of 500 when given invalid request body。 作为第一件事,我尝试在帖子的第一个答案中编写的代码,但结果与以前相同:当我故意在请求正文中插入错误时,我总是获得 500 错误代码而不是 400。 我还尝试将 @JsonIgnoreProperties(ignoreUnknown=true) 放在处理拦截请求正文的类之上,但对我不起作用。

【问题讨论】:

    标签: java json exception-handling jersey jackson


    【解决方案1】:

    我认为问题在于您尚未将 ExceptionMapper 注册到应用程序运行时加载类提供程序中。 尝试使用以下代码将映射器类添加到其中:

       @javax.ws.rs.ApplicationPath("/")
        public class MyApplication extends ResourceConfig {
           public MyApplication() {
               packages("controller");
               register(JacksonFeature.class);
               register(ClientExceptionMapper.class);          
           }
        }
    

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      相关资源
      最近更新 更多