我有一个包含以下模块的EJB项目:
如果出现问题并且客户端应该收到错误,我使用的是自定义异常,它是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>
@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());
}
}
答案 0 :(得分:0)
修改业务异常以扩展EJBException并在REST层中捕获:
try {
// my code
}
catch (MyCustomExceptionThatExtendsEJBException e) {
// catch my exceptions.
}