gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:18:30 25 4
gpt4 key购买 nike

我想使用 Dropwizard 应用程序拦截错误的 JSON 输入并返回自定义错误消息。我按照此处提到的定义自定义异常映射器的方法进行操作: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();
}

}

最佳答案

问题一:

Jackson 抛出的异常没有扩展 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

关于jersey - Dropwizard 拦截错误的 json 并返回自定义错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com