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

  显示原文与译文双语对照的内容
0 0

我想拦截一个错误的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();
 }

}

时间: 原作者:

0 0

问题 1:

Jackson抛出的异常并不扩展 RuntimeException,但它确实会扩展 Exception 。 这并不重要。( 请参见问题 2 )

问题 2:

DropwizardResourceConfig,注册它自己的 JsonProcessingExceptionMapper 因此,你应该已经看到类似于


{
"message":"Unrecognized field "field" (class d.s.h.c.MyClass),..."
}

如果你想覆盖这一点,那么你应该创建一个更为具体。 在使用异常映射器时,将选择最具体的映射器。 JsonProcessingExceptionJsonMappingExceptionJsonProcessingException 子类进行子类化,因这里你需要为每个类别创建一个异常映射器。 然后 register,我不确定如何注销 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

原作者:
...