java - JAX-RS 和 EJB 异常处理

标签 java exception-handling ejb jax-rs

我在处理 RESTful 服务中的异常时遇到问题:

@Path("/blah")
@Stateless
public class BlahResource {
    @EJB BlahService blahService;

    @GET
    public Response getBlah() {
        try {
            Blah blah = blahService.getBlah();
            SomeUtil.doSomething();
            return blah;
        } catch (Exception e) {
            throw new RestException(e.getMessage(), "unknown reason", Response.Status.INTERNAL_SERVER_ERROR);
        }
    }
}

RestException 是一个映射异常:

public class RestException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    private String reason;
    private Status status;

    public RestException(String message, String reason, Status status) {
        super(message);
        this.reason = reason;
        this.status = status;
    }
}

这里是 RestException 的异常映射器:

@Provider
public class RestExceptionMapper implements ExceptionMapper<RestException> {

    public Response toResponse(RestException e) {
        return Response.status(e.getStatus())
            .entity(getExceptionString(e.getMessage(), e.getReason()))
            .type("application/json")
            .build();
    }

    public String getExceptionString(String message, String reason) {
        JSONObject json = new JSONObject();
        try {
            json.put("error", message);
            json.put("reason", reason);
        } catch (JSONException je) {}
        return json.toString();
    }

}

现在,向最终用户提供响应代码和一些响应文本对我来说很重要。但是,当抛出 RestException 时,这会导致 EJBException(带有消息“EJB 抛出一个意外的(未声明的)异常......”)也被抛出,并且 servlet 仅将响应代码返回给客户端(并且不是我在 RestException 中设置的响应文本)。

当我的 RESTful 资源不是 EJB 时,这可以完美地工作……有什么想法吗?我已经为此工作了几个小时,但我完全没有想法。

谢谢!

最佳答案

问题似乎与 EJB 异常处理有关。根据规范,从托管 bean 中抛出的任何 系统异常(即 - 任何未明确标记为应用程序异常的 RuntimeException)都将打包到 EJBException 中,如果需要,稍后将打包到 RemoteException 中抛出客户端。您似乎正处于这种情况,为了避免这种情况,您可以:

  • 将您的 RestException 更改为已检查的异常并照此处理
  • 使用@ApplicationException在你的 RestException 上注释
  • 创建 EJBExceptionMapper 并从 (RestfulException) e.getCause() 中提取所需的信息

关于java - JAX-RS 和 EJB 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6885973/

相关文章:

ios - 如何在 IOS 应用程序中启用除以零的 SIGFPE 信号?

JSF View Scoped Bean 多次重构

java - 如何使用 servlet 访问 Restful Web 服务?

java - JSch SFTP 详细日志记录

java - 访问服务组件中的静态变量的好方法

c# - 如何调试 "The type initializer for ' 我的类(class)抛出异常”

处理多个可能的文件位置的 Pythonic 方式? (不使用嵌套尝试)

jsf - EJB 依赖 FacesContext 是一个糟糕的设计吗?

java - 没有@Stateless 可以使用@Webservice 注解吗?

java - 逆波兰表示法时出现问题(Java)