我使用Jersey 2.5.1和Jackson 2.2。用于构建JSON Rest Web服务。我有点使用2个ExceptionMappers并运行但是对于“not-json”请求,应用程序不会抛出任何异常!
ExceptionMapper 将被调用,例如,抛出NullPointerException
ExceptionMapper 如果JSon Mapping
我的问题: 1.请求机构:{}有效 2. Request Body:{}与应用程序端NullPointer调用第一个异常映射器 3.请求正文:“jibberish”不会调用任何东西(没有被任何ExceptionMapper捕获)因为没有抛出异常。不幸的是,响应主体是这样的:无法识别的字段“xxx”(类com.sample.MyDto),未标记为可忽略(9个已知属性... ....>但我想自定义错误消息,因为我总是返回一个JSon对象。
答案 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。