Ao utilizar um ExceptionMapper
para tratar exceções em uma aplicação Java EE, é comum que exceções lançadas dentro do contexto de um EJB sejam automaticamente encapsuladas em uma EJBException
. Esse comportamento pode dificultar a captura e o tratamento adequado da exceção original.
Para evitar que a exceção seja envolvida por uma EJBException
, basta anotá-la com @ApplicationException
. Essa anotação informa ao container do EJB que a exceção é de aplicação e não deve ser encapsulada automaticamente.
Exemplo de Código
import jakarta.ejb.ApplicationException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
// Definição de uma exceção de aplicação personalizada
@ApplicationException
public class MinhaExcecao extends RuntimeException {
public MinhaExcecao(String message) {
super(message);
}
}
// Implementação do ExceptionMapper para capturar a exceção e gerar uma resposta HTTP adequada
@Provider
public class MinhaExcecaoMapper implements ExceptionMapper<MinhaExcecao> {
@Override
public Response toResponse(MinhaExcecao exception) {
return Response.status(Response.Status.BAD_REQUEST)
.entity("Erro: " + exception.getMessage())
.build();
}
}
// EJB que lança a exceção personalizada
import jakarta.ejb.Stateless;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
@Stateless
@Path("recurso")
public class MeuRecursoEJB {
@GET
public String metodoQueLancaExcecao() {
throw new MinhaExcecao("Ocorreu um erro específico na lógica de negócio.");
}
}
Explicação do Código
-
Criação de uma exceção personalizada (
MinhaExcecao
): A anotação@ApplicationException
evita que ela seja encapsulada em umaEJBException
. -
Implementação de um
ExceptionMapper
: CapturaMinhaExcecao
e retorna uma resposta HTTP 400 (Bad Request). -
EJB lançando a exceção: O método
metodoQueLancaExcecao()
simula um erro que será tratado peloExceptionMapper
.
Com essa abordagem, garantimos que a exceção seja tratada de maneira controlada e previsível, melhorando a experiência do usuário e a manutenção da aplicação.