通过多个EJB模块传递@AppExException

时间:2014-09-09 11:08:39

标签: java-ee glassfish ejb jax-rs

我有一个包含以下模块的EJB项目:

  • 处理api调用的休息模块
  • 为核心提供接口的api模块
  • 包含实际业务逻辑的核心模块

如果出现问题并且客户端应该收到错误,我使用的是自定义异常,它是WebApplicationException的子类,并且已经包含相应的响应。

@ApplicationException(rollback = true)
public class InvalidParameterException extends WebApplicationException { }

永远不应该抓住这些例外。将其注释为ApplicationException时,glassfish服务器日志不会将其拾取。到目前为止一切正常。

现在我有一种情况,其中核心模块包含另一个EJB模块,其中包含自己的WebApplicationExceptions子类,其外观类似于上面提到的。此异常将按原样传递给核心。但是,当此异常传递给rest模块时,它会被包装到javax.ejb.EJBTransactionRolledbackException中,这会导致glassfish服务器日志记录所有这些异常,我想避免这些异常。

因此,@ applicationException注释仅在异常从ejb模块传递到核心模块时才起作用,但是只要它进一步传递给rest模块,注释就不再生效。

有没有一种好方法可以通过多个模块将Exception作为ApplicationException传递?我知道我可以捕获Exception并再次将它重新抛出为ApplicationException,但是这会使代码膨胀很多并且看起来不是一个非常好的解决方案。有没有更好的办法?

编辑:一些示例代码

休息模块:

@Path("/someservice")
@Stateless
public class SomeResource {

    @EJB private SomeService someService;

    @GET
    @Produces("application/json")
    public Response someGetMethod() {
        this.someService.someMethod();
        return Response.ok().build();
    }
}

api模块:

public Interface SomeService {
    public void someMethod();
}

核心模块:

@Stateless
public Class SomeServiceImpl implements SomeService {

    @EJB private ExternalEJB externalEJB;

    public void someMethod() {
        externalEJB.externalMethod();
    }
}

外部EJB模块。通过<type>ejb</type>

包含在pom.xml(核心模块)中
@Stateless
public class ExternalEJB {
    public void externalMethod() {
       throw new ExternalApplicationException();
    }
}

来自外部模块的例外:

@ApplicationException
public class ExternalApplicationException extends WebApplicationException {

    private static final long serialVersionUID = 1L;

    public ExternalApplicationException() {
        super(Response.serverError().build());
    }
}

1 个答案:

答案 0 :(得分:0)

修改业务异常以扩展EJBException并在REST层中捕获:

try {
   // my code
}
catch (MyCustomExceptionThatExtendsEJBException e) {
    // catch my exceptions.
}