Dropwizard拦截坏json并返回自定义错误消息

时间:2015-02-14 01:21:54

标签: jersey dropwizard

我想截取一个糟糕的JSON输入并使用Dropwizard应用程序返回自定义错误消息。我按照这里提到的定义自定义异常映射器的方法:http://gary-rowe.com/agilestack/2012/10/23/how-to-implement-a-runtimeexceptionmapper-for-dropwizard/。但它对我不起作用。同样的问题在这里被问到https://groups.google.com/forum/#!topic/dropwizard-user/r76Ny-pCveA,但没有答案。

任何帮助都将受到高度赞赏。

我的代码如下,我在dropwizard中将其注册为environment.jersey()。register(RuntimeExceptionMapper.class);

@Provider
public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {

    private static Logger logger = LoggerFactory.getLogger(RuntimeExceptionMapper.class);

    @Override
    public Response toResponse(RuntimeException runtime) {
        logger.error("API invocation failed. Runtime : {}, Message : {}", runtime, runtime.getMessage());
        return Response.serverError().type(MediaType.APPLICATION_JSON).entity(new Error()).build();
    }

}

1 个答案:

答案 0 :(得分:2)

问题1:

杰克逊抛出的例外不会延伸RuntimeException,但 延伸Exception。但这并不重要。 (见问题2)

问题2:

DropwizardResourceConfig,注册它自己的JsonProcessingExceptionMapper。所以你应该已经看到类似于

的结果了
{
    "message":"Unrecognized field \"field\" (class d.s.h.c.MyClass),..."
}

现在,如果要覆盖它,则应创建更具体的异常映射器。使用异常映射器时,将选择最具体的映射器。 JsonProcessingExceptionJsonMappingExceptionJsonProcessingException的子类,因此您需要为每个子类创建一个例外映射器。然后注册他们。我不确定如何取消注册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;
    }
}

然后您可以自由使用自己的映射器JsonProcessingException