Tratando Runtime Exceptions em EJB com ExceptionMapper e @ApplicationException

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

  1. Criação de uma exceção personalizada (MinhaExcecao): A anotação @ApplicationException evita que ela seja encapsulada em uma EJBException.

  2. Implementação de um ExceptionMapper: Captura MinhaExcecao e retorna uma resposta HTTP 400 (Bad Request).

  3. EJB lançando a exceção: O método metodoQueLancaExcecao() simula um erro que será tratado pelo ExceptionMapper.

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.

Leave a Reply

Your email address will not be published. Required fields are marked *