{"id":478,"date":"2025-03-26T14:20:22","date_gmt":"2025-03-26T14:20:22","guid":{"rendered":"https:\/\/sidroniolima.com.br\/blog\/?p=478"},"modified":"2025-03-26T14:20:23","modified_gmt":"2025-03-26T14:20:23","slug":"tratando-runtime-exceptions-em-ejb-com-exceptionmapper-e-applicationexception","status":"publish","type":"post","link":"https:\/\/sidroniolima.com.br\/blog\/2025\/03\/26\/tratando-runtime-exceptions-em-ejb-com-exceptionmapper-e-applicationexception\/","title":{"rendered":"Tratando Runtime Exceptions em EJB com ExceptionMapper e @ApplicationException"},"content":{"rendered":"\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=sidroniolima\" class=\"twitter-share-button\">Tweet<\/a><\/div>\n\n<p>Ao utilizar um <code>ExceptionMapper<\/code> para tratar exce\u00e7\u00f5es em uma aplica\u00e7\u00e3o Java EE, \u00e9 comum que exce\u00e7\u00f5es lan\u00e7adas dentro do contexto de um EJB sejam automaticamente encapsuladas em uma <code>EJBException<\/code>. Esse comportamento pode dificultar a captura e o tratamento adequado da exce\u00e7\u00e3o original.<\/p>\n<p>Para evitar que a exce\u00e7\u00e3o seja envolvida por uma <code>EJBException<\/code>, basta anot\u00e1-la com <code>@ApplicationException<\/code>. Essa anota\u00e7\u00e3o informa ao container do EJB que a exce\u00e7\u00e3o \u00e9 de aplica\u00e7\u00e3o e n\u00e3o deve ser encapsulada automaticamente.<\/p>\n<h4>Exemplo de C\u00f3digo<\/h4>\n<pre><code class=\"language-java\">import jakarta.ejb.ApplicationException;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.ext.ExceptionMapper;\nimport jakarta.ws.rs.ext.Provider;\n\n\/\/ Defini\u00e7\u00e3o de uma exce\u00e7\u00e3o de aplica\u00e7\u00e3o personalizada\n@ApplicationException\npublic class MinhaExcecao extends RuntimeException {\n    public MinhaExcecao(String message) {\n        super(message);\n    }\n}\n\n\/\/ Implementa\u00e7\u00e3o do ExceptionMapper para capturar a exce\u00e7\u00e3o e gerar uma resposta HTTP adequada\n@Provider\npublic class MinhaExcecaoMapper implements ExceptionMapper&lt;MinhaExcecao&gt; {\n    @Override\n    public Response toResponse(MinhaExcecao exception) {\n        return Response.status(Response.Status.BAD_REQUEST)\n                .entity(\"Erro: \" + exception.getMessage())\n                .build();\n    }\n}\n\n\/\/ EJB que lan\u00e7a a exce\u00e7\u00e3o personalizada\nimport jakarta.ejb.Stateless;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\n\n@Stateless\n@Path(\"recurso\")\npublic class MeuRecursoEJB {\n    @GET\n    public String metodoQueLancaExcecao() {\n        throw new MinhaExcecao(\"Ocorreu um erro espec\u00edfico na l\u00f3gica de neg\u00f3cio.\");\n    }\n}\n<\/code><\/pre>\n<h3>Explica\u00e7\u00e3o do C\u00f3digo<\/h3>\n<ol>\n<li>\n<p><strong>Cria\u00e7\u00e3o de uma exce\u00e7\u00e3o personalizada (<code>MinhaExcecao<\/code>)<\/strong>: A anota\u00e7\u00e3o <code>@ApplicationException<\/code> evita que ela seja encapsulada em uma <code>EJBException<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Implementa\u00e7\u00e3o de um <code>ExceptionMapper<\/code><\/strong>: Captura <code>MinhaExcecao<\/code> e retorna uma resposta HTTP 400 (Bad Request).<\/p>\n<\/li>\n<li>\n<p><strong>EJB lan\u00e7ando a exce\u00e7\u00e3o<\/strong>: O m\u00e9todo <code>metodoQueLancaExcecao()<\/code> simula um erro que ser\u00e1 tratado pelo <code>ExceptionMapper<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>Com essa abordagem, garantimos que a exce\u00e7\u00e3o seja tratada de maneira controlada e previs\u00edvel, melhorando a experi\u00eancia do usu\u00e1rio e a manuten\u00e7\u00e3o da aplica\u00e7\u00e3o.<\/p>\n\n\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=sidroniolima\" class=\"twitter-share-button\">Tweet<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ao utilizar um ExceptionMapper para tratar exce\u00e7\u00f5es em uma aplica\u00e7\u00e3o Java EE, \u00e9 comum que exce\u00e7\u00f5es lan\u00e7adas dentro do contexto de um EJB sejam automaticamente encapsuladas em uma EJBException. Esse comportamento pode dificultar a captura e o tratamento adequado da exce\u00e7\u00e3o original. Para evitar que a exce\u00e7\u00e3o seja envolvida por uma EJBException, basta anot\u00e1-la com [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-478","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/posts\/478","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/comments?post=478"}],"version-history":[{"count":1,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/posts\/478\/revisions"}],"predecessor-version":[{"id":479,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/posts\/478\/revisions\/479"}],"wp:attachment":[{"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/media?parent=478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/categories?post=478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/tags?post=478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}