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

时间:2014-01-23 15:14:30

标签: java jersey jackson jax-rs jersey-2.0

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

  1. ExceptionMapper 将被调用,例如,抛出NullPointerException

  2. ExceptionMapper 如果JSon Mapping

  3. 出现问题,将调用

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

2 个答案:

答案 0 :(得分: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等,那些不记录:)

因此,有时应用程序首先加载我的,有时是杰克逊的加载。 所以我现在要坚持以下内容:

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

        packages("com.sample");
    }
}

希望有助于sb:D

答案 1 :(得分: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。

所以我改变了我的自定义MapperException的通用性类型: ExceptionMapper 至 ExceptionMapper

可能是我的决议不适合你, 主要问题是ExceptionMapper。