gpt4 book ai didi

java - JAX-RS 异常映射器 : What about wrapped exceptions and default case?

转载 作者:行者123 更新时间:2023-12-04 01:26:28 24 4
gpt4 key购买 nike

在 REST 服务中处理异常的典型方法是定义自定义异常类型(通常来自 RuntimeException),然后实现一个映射器类来生成 HTTP 代码,例如:

public class MyExceptionMapper implements ExceptionMapper<MyException> {
@Override
public Response toResponse(MyExceptionex) {
return Response.status(400).entity("bad request")
.type(MediaType.APPLICATION_JSON).build();
}
}

现在,我有两个问题:

  • 我将如何为“默认情况”实现映射器,这意味着对于未在此处或另一个映射器中映射的每个异常?例如,当为 Throwable 实现一个以生成 HTTP 500 时,它不会再次捕获我自己的异常吗?还是可以定义映射器工作的顺序?
  • 当从 REST 服务调用托管组件(如 EJB)时,抛出的异常不会导致 EJBException 或一些包含我自己的异常的 Transaction...Exception 吗?

最佳答案

“默认情况”的映射器...

正如 Paul Samsotha 在评论中所写,JAX-RS 服务器运行时应该选择最具体的异常映射器。或者引用 JAX-RS 规范(针对 JEE7/2.0 版):

3.3.4 Exceptions

[...]

  1. If an exception mapping provider (see Section 4.4) is available for the exception or one of its superclasses, an implementation MUST use the provider whose generic type is the nearest superclass of the exception to create a Response instance that is then processed according to Section 3.3.3.[...]

所以我猜你可以为 Throwable 使用异常映射器 - 它的签名无论如何都会验证它:

public interface ExceptionMapper<E extends Throwable> {...}

从 REST 服务调用 EJB 等托管组件时...

如果需要包装异常,EJB 容器将包装它。并非所有 EJB 抛出的异常都需要包装。 EJB 规范 (v3.1) 区分了应用程序异常(使用 javax.ejb.ApplicationException 注释)和“所有其他异常”(参见第 14.3 节)。因此,创建异常 @ApplicationException 并为其提供映射器。但是如果你还想根据wrapped异常做出响应:

根据包装的异常响应

您不能根据包装的异常直接选择映射器。但是您可以wrapper 异常创建一个异常映射器,该异常映射器解包它并根据 wrapper 异常选择适当的映射器Providers 上下文(请参阅 JAX-RS 2.0 第 9.2.6 节和 javax.ws.rs.ext.Providers Javadocs)。例如,假设 MyWrapperException 的未经测试的代码是:

@Provider
public class MyWrapperExceptionMapper implements ExceptionMapper<MyWrapperException> {
@Context
private Providers providers;

public Response toResponse(MyWrapperException e) {
Throwable t = e.getCause();
ExceptionMapper mapper = providers.getExceptionMapper(t.getClass());
if( mapper != null ) {
return mapper.toResponse(t);
}
else {
// custom handling...
}
}
}

关于java - JAX-RS 异常映射器 : What about wrapped exceptions and default case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52500550/

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