Jersey Dropwizard截获错误的json并返回自定义错误消息

Jersey Dropwizard截获错误的json并返回自定义错误消息,jersey,dropwizard,Jersey,Dropwizard,我想截获错误的JSON输入,并使用Dropwizard应用程序返回自定义错误消息。我遵循了定义自定义异常映射器的方法,如下所述:。但这对我不起作用。这里也有人问过同样的问题,但没有得到回答 任何帮助都将不胜感激 下面是我的代码,我正在dropwizard中将其注册为environment.jersey().register(RuntimeExceptionMapper.class) @Provider 公共类RuntimeExceptionMapper实现ExceptionMapper{ 私有静

我想截获错误的JSON输入,并使用Dropwizard应用程序返回自定义错误消息。我遵循了定义自定义异常映射器的方法,如下所述:。但这对我不起作用。这里也有人问过同样的问题,但没有得到回答

任何帮助都将不胜感激

下面是我的代码,我正在dropwizard中将其注册为environment.jersey().register(RuntimeExceptionMapper.class)

@Provider
公共类RuntimeExceptionMapper实现ExceptionMapper{
私有静态记录器Logger=LoggerFactory.getLogger(RuntimeExceptionMapper.class);
@凌驾
公共响应响应(运行时异常运行时){
错误(“API调用失败。运行时:{},消息:{}”,运行时,运行时.getMessage());
返回Response.serverError().type(MediaType.APPLICATION_JSON).entity(newerror()).build();
}
}
问题1: Jackson引发的异常不会扩展
RuntimeException
,但会扩展
exception
。但这并不重要。(见问题2)

问题2: ,注册它自己的。因此,您应该已经看到类似的结果

{
    "message":"Unrecognized field \"field\" (class d.s.h.c.MyClass),..."
}
现在,如果您想覆盖它,那么您应该创建一个更具体的异常映射器。使用异常映射器时,将选择最具体的映射器
JsonProcessingException
JsonMappingException
JsonProcessingException
子类化,因此您需要为其中每一个创建异常映射器。然后注册它们。我不知道如何注销Dropwizard
JsonProcessingExceptionMapper
,否则我们可以为
JsonProcessingException
创建一个映射器,这样就省去了创建两者的麻烦

更新 因此,如果需要,可以通过以下操作删除Dropwizard映射器

Set<Object> providers = environment.jersey().getResourceConfig().getSingletons();
Iterator it = providers.iterator();
while (it.hasNext()) {
    Object val = it.next();
    if (val instanceof JsonProcessingExceptionMapper) {
        it.remove();
        break;
    }
}
Set providers=environment.jersey().getResourceConfig().getSingleton();
迭代器it=providers.Iterator();
while(it.hasNext()){
Object val=it.next();
if(JsonProcessingExceptionMapper的val实例){
it.remove();
打破
}
}
然后您就可以自由地使用自己的映射器,
JsonProcessingException

Set<Object> providers = environment.jersey().getResourceConfig().getSingletons();
Iterator it = providers.iterator();
while (it.hasNext()) {
    Object val = it.next();
    if (val instanceof JsonProcessingExceptionMapper) {
        it.remove();
        break;
    }
}