首页 文章

如果接收到无效的JSon,则不会调用ExceptionMapper

提问于
浏览
0

我使用Jersey 2.5.1和Jackson 2.2 . 用于构建JSON Rest Web服务 . 我有点了,并且运行了2个ExceptionMappers但是对于“not-json”请求,应用程序没有抛出任何异常!

  • ExceptionMapper将被调用,例如抛出NullPointerException

  • ExceptionMapper如果JSon Mapping出现问题,将调用它

我的问题:1 . 请求正文:{}工作2.请求正文:{}与应用程序端NullPointer调用第一个异常映射器3.请求正文:“jibberish”不调用任何东西(没有被任何ExceptionMapper捕获)导致没有异常被扔了 . 不幸的是,响应主体是这样的:无法识别的字段“xxx”(类com.sample.MyDto),未标记为可忽略(9个已知属性......)但我想自定义错误消息,因为我总是返回一个JSon对象 .

2 回答

  • 1

    好的,我解决了 . 最后让我觉得正确的方法是,有时它有效,所以它必须是一些覆盖类加载问题 .

    在我的ApplicationClass中,我根据这样的包注册了Providers

    @ApplicationPath("resources")
        public class JerseyApplication extends ResourceConfig {
        public JerseyRestApplication() {            
            packages("com.sample", "com.fasterxml.jackson.jaxrs.json");
        }
    }
    

    如果你看起来很锋利,你可能会看到错误!我在搜索路径上放了“com.fasterxml.jackson.jaxrs.json”,因为我想使用JacksonJsonProvider.class . 我不知道的是,在那个包中还有一些JSonMappers用于JSonParseException等,而那些不记录:)

    所以有时应用程序首先加载我的,有时候是 Jackson 加载的 . 所以我现在要坚持以下内容:

    @ApplicationPath("resources")
    public class JerseyRestApplication extends ResourceConfig {
        public JerseyApplication() {
            register(JacksonJsonProvider.class); // Do it manually
    
            packages("com.sample");
        }
    }
    

    希望有助于某事:D

  • 0

    我也发现某些时候,ExceptionMapper无法正常工作,并且它并不总是有效或无效 .

    所以我调试了球衣的源代码 .

    class:org.glassfish.jersey.server.ServerRuntime,methed:mapException

    ...
     final long timestamp = tracingLogger.timestamp(ServerTraceEvent.EXCEPTION_MAPPING);
     **ExceptionMapper mapper = runtime.exceptionMappers.findMapping(throwable);**
     if (mapper != null) {
          request.getRequestEventBuilder().setExceptionMapper(mapper);
     ...
    

    如果映射器为null,那么coustom ExceptionMapper将不起作用 .

    class:org.glassfish.jersey.internal.ExceptionMapperFactory methed:ExceptionMapperFactory

    异常映射器:(有两个异常映射一个异常:java.lang.Exception)

    org.glassfish.jersey.server.mvc.internal.ErrorTemplateExceptionMapper @ 6473fc2,类java.lang.Exception

    ...

    com.baidu.ssp.web.ws.exception.BaseExceptionMapper @ 7a84639c,类java.lang.Exception

    这是因为在MvcFeature中:

    @Override
    public boolean configure(final FeatureContext context) {
        final Configuration config = context.getConfiguration();
    
        if (!config.isRegistered(ErrorTemplateExceptionMapper.class)) {
            context.register(ErrorTemplateExceptionMapper.class);
            context.register(new MvcBinder());
    
            return true;
        }
    
        return false;
    }
    

    ErrorTemplateExceptionMapper也添加到ExceptionMapper .

    so i change my custom MapperException's genericity type : ExceptionMapper to ExceptionMapper

    可能是我的分辨率不适合你,主要问题是ExceptionMapper .

相关问题