I made a very simple example, just a resource that throws a SecurityException without anything else. Its not maven, i dont use it :(
I also added a system out of the media type, i get null again (resource has a Produces annotation)
I uploaded the file to rapidshare, the password is jersey.
http://rapidshare.com/files/287805087/RestTest.rar.html
Thanks,
Jordi
P.D.
The stacktrace of the example is:
javax.ejb.EJBException
at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:4947)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:4845)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4633)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1871)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1822)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
at $Proxy185.failMethod(Unknown Source)
at com.domborjo.rest.__EJB31_Generated__TestResource__Intf____Bean__.failMethod(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:156)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:208)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:75)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:115)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:67)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:724)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:689)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:680)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:324)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:425)
at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:751)
at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:703)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:333)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:234)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:146)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:753)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:661)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:914)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:166)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.FixedThreadPool$BasicWorker.dowork(FixedThreadPool.java:379)
at com.sun.grizzly.util.FixedThreadPool$BasicWorker.run(FixedThreadPool.java:360)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.SecurityException
at com.domborjo.rest.TestResource.failMethod(TestResource.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1038)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1110)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5120)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:610)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:775)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:562)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:836)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:775)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:349)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5092)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5080)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190)
... 45 more
Date: Fri, 2 Oct 2009 17:23:42 +0200
From: Paul.Sandoz_at_Sun.COM
To: users_at_jersey.dev.java.net
Subject: Re: [Jersey] ExceptionMapper and Viewable
On Oct 2, 2009, at 5:10 PM, Jordi Domingo wrote:Hi again Paul!
I saw that sometimes (to change behavior the server must be restarted) the exception goes through the mapper and sometimes not and it gets dumped. Maybe is a glassfish bug :S
Quite possibly.
In any case, do you know wich component may be dumping the exception (its an stacktrace like the one in glassfish logs).
Can you send the stacktrace ?
----
I tried using HttpContext:
@Context HttpContext httpContext;
And in the toResponse(..)
MediaType m = httpContext.getResponse().getMediaType();
MediaType selected = httpContext.getRequest().getMediaType();
I get null.
If "m" is null it implies that no resource method was called with @Produces.
I think i would need to see more of your application to understand where the EJBException is originating from. In fact if you can send me a zip file of a maven project that would help.
Recently i modified the behavior of processing EJBExcpetion such that Jersey registered a mapper for that class (see end of email). This is in 1.1.2. So actually EJBExcpetion will never be propagated to the Servlet container. Perhaps that is why things are not working for you. Note that you can override this with your own implementation.
The mapper will attempt to extract the cause of the exception then attempt to map that.
Does that give any more clues? as i said an example would help then i can debug it.
Paul.
public class EJBExceptionMapper implements ExceptionMapper<EJBException> {
private final Providers providers;
public EJBExceptionMapper(@Context Providers providers) { this.providers = providers; }
public Response toResponse(EJBException exception) { final Exception cause = exception.getCausedByException(); if (cause != null) { final ExceptionMapper mapper = providers.getExceptionMapper(cause.getClass()); if (mapper != null) { return mapper.toResponse(cause); } else if (cause instanceof WebApplicationException) { return ((WebApplicationException)cause).getResponse(); } }
return Response.serverError().build(); }}
---
The first thing i tried was using the servlet exception rules (im using that yet with the mapper for EJBException) but happens the same with glassfish dumping the exception:
<error-page>
<exception-type>com.sun.jersey.api.container.MappableContainerException</exception-type>
<location>/jsp/ejbException.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/jsp/ejbException.jsp</location>
</error-page>
---
When a user sends a request, jersey selects wich method must attend the user and jersey know which one will be the response type by default. Is there any method for me, to know wich one will be? (httpContext.getResponse().getMediaType() returns null)
Thanks Paul!
> Date: Thu, 1 Oct 2009 10:33:48 +0200
> From: Paul.Sandoz_at_Sun.COM
> To: users_at_jersey.dev.java.net
> Subject: Re: [Jersey] ExceptionMapper and Viewable
>
> On Sep 30, 2009, at 1:44 PM, Jordi Domingo wrote:
>
> >
> > Hi :)
> >
> > I'm trying to make an ExceptionMapper that returns the response
> > expected by the client. I dont know how i can return a Viewable or a
> > JSON response because i dont have access to any object with that
> > information
> >
> > public Response toResponse(EJBException exception) {}
> >
>
> If a resource method was selected for invocation then the Content-Type
> of the response will have been selected if the @Produces specifies a
> concrete (non-wild card) media type. So if the Content-Type is present
> you can look at that.
>
> You can inject Jersey's HttpContext on the ExceptionMapper and in the
> toResponse method you can do:
>
> MediaType m = httpContext.getResponse().getMediaType();
>
> You can also get access to the acceptable headers by doing:
>
> httpContext.getRequest().getAcceptableMediaTypes()
>
> (That method is a method on javax.ws.rs.core.HttpHeaders, which can be
> injected if required rather than referring to something Jersey
> specific).
>
>
> > On another side, when Jersey finds an Exception (not Runtime) that
> > is not mapped, forwards it to the ServletContainer, thats fine.
>
> Any RuntimeException that is not mapped will be re-thrown and it will
> pass through Jersey's Servlet layer to the Servlet framework from
> where it can be mapped using Servlet-based rules.
>
> Any checked exception that is not mapped will be wrapped around a
> Jersey runtime exception (ContainerException) and that will be passed
> to Jersey's Servlet layer and wrapped in a ServletException exception
> and re-thrown.
>
>
> > When i do the same with an EJBException (SystemException) I dont
> > know how to achieve the same behavior. This is my code for testing:
> >
> > public Response toResponse(EJBException exception) {
> > final Exception cause = exception.getCausedByException();
> >
> > return new WebApplicationException(cause).getResponse();
> > }
> >
>
> I am not sure i understand what you want to achieve.
>
> Do you want the EJBException to be passed through to the Servlet
> framework?
>
> Paul.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>
Charlas más divertidas con el nuevo Windows Live Messenger
_________________________________________________________________
Chatea sin límites en Messenger con la tarifa plana de Orange
http://serviciosmoviles.es.msn.com/messenger/orange.aspx
--_582c2ee6-df4f-4188-a06a-0bbd88b59b59_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
I made a very simple example, just a resource that throws a SecurityException without anything else. Its not maven, i dont use it :(<br>I also added a system out of the media type, i get null again (resource has a Produces annotation)<br><br>I uploaded the file to rapidshare, the password is jersey. http://rapidshare.com/files/287805087/RestTest.rar.html<br><br>Thanks,<br><br>Jordi <br><br>P.D.<br>The stacktrace of the example is:<br><br><pre>javax.ejb.EJBException<br> at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:4947)<br> at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:4845)<br> at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4633)<br> at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1871)<br> at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1822)<br> at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)<br> at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)<br> at $Proxy185.failMethod(Unknown Source)<br> at com.domborjo.rest.__EJB31_Generated__TestResource__Intf____Bean__.failMethod(Unknown Source)<br> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br> at java.lang.reflect.Method.invoke(Method.java:597)<br> at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:156)<br> at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)<br> at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:208)<br> at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:75)<br> at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:115)<br> at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:67)<br> at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:724)<br> at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:689)<br> at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:680)<br> at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:324)<br> at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:425)<br> at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:751)<br> at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:703)<br> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)<br> at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)<br> at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)<br> at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)<br> at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)<br> at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)<br> at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)<br> at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)<br> at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:333)<br> at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:234)<br> at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:146)<br> at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:753)<br> at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:661)<br> at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:914)<br> at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:166)<br> at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)<br> at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)<br> at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)<br> at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)<br> at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)<br> at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)<br> at com.sun.grizzly.ContextTask.run(ContextTask.java:69)<br> at com.sun.grizzly.util.FixedThreadPool$BasicWorker.dowork(FixedThreadPool.java:379)<br> at com.sun.grizzly.util.FixedThreadPool$BasicWorker.run(FixedThreadPool.java:360)<br> at java.lang.Thread.run(Thread.java:619)<br>Caused by: java.lang.SecurityException<br> at com.domborjo.rest.TestResource.failMethod(TestResource.java:24)<br> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br> at java.lang.reflect.Method.invoke(Method.java:597)<br> at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1038)<br> at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1110)<br> at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5120)<br> at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:610)<br> at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:775)<br> at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:562)<br> at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)<br> at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)<br> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br> at java.lang.reflect.Method.invoke(Method.java:597)<br> at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:836)<br> at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:775)<br> at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:349)<br> at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5092)<br> at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5080)<br> at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190)<br> ... 45 more<br></pre><br><br><hr id="stopSpelling">Date: Fri, 2 Oct 2009 17:23:42 +0200<br>From: Paul.Sandoz@Sun.COM<br>To: users@jersey.dev.java.net<br>Subject: Re: [Jersey] ExceptionMapper and Viewable<br><br><br><div><div>On Oct 2, 2009, at 5:10 PM, Jordi Domingo wrote:</div><br class="ecxApple-interchange-newline"><blockquote><span class="ecxApple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><div class="ecxhmmessage" style="font-size: 10pt; font-family: Verdana;">Hi again Paul!<br><br>I saw that sometimes (to change behavior the server must be restarted) the exception goes through the mapper and sometimes not and it gets dumped. Maybe is a glassfish bug :S </div></span></blockquote><div><br></div>Quite possibly.</div><div><br></div><div><br><blockquote><span class="ecxApple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><div class="ecxhmmessage" style="font-size: 10pt; font-family: Verdana;">In any case, do you know wich component may be dumping the exception (its an stacktrace like the one in glassfish logs).<br></div></span></blockquote><div><br></div>Can you send the stacktrace ?</div><div><br></div><div><br><blockquote><span class="ecxApple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><div class="ecxhmmessage" style="font-size: 10pt; font-family: Verdana;">----<br><br>I tried using HttpContext:<br><br>@Context HttpContext httpContext;<br><br>And in the toResponse(..)<br><br>MediaType m = httpContext.getResponse().getMediaType();<br>MediaType selected = httpContext.getRequest().getMediaType();<br><br>I get null.<span class="ecxApple-converted-space"> </span><br></div></span></blockquote><div><br></div>If "m" is null it implies that no resource method was called with @Produces.</div><div><br></div><div>I think i would need to see more of your application to understand where the EJBException is originating from. In fact if you can send me a zip file of a maven project that would help.</div><div><br></div><div>Recently i modified the behavior of processing EJBExcpetion such that Jersey registered a mapper for that class (see end of email). This is in 1.1.2. So actually EJBExcpetion will never be propagated to the Servlet container. Perhaps that is why things are not working for you. Note that you can override this with your own implementation.</div><div><br></div><div>The mapper will attempt to extract the cause of the exception then attempt to map that.</div><div><br></div><div>Does that give any more clues? as i said an example would help then i can debug it.</div><div><br></div><div>Paul.</div><div><br></div><div><br></div><div><div>public class EJBExceptionMapper implements ExceptionMapper<EJBException> {</div><div><br></div><div> private final Providers providers;</div><div><br></div><div> public EJBExceptionMapper(@Context Providers providers) {</div><div> this.providers = providers;</div><div> }</div><div><br></div><div> public Response toResponse(EJBException exception) {</div><div> final Exception cause = exception.getCausedByException();</div><div> if (cause != null) {</div><div> final ExceptionMapper mapper = providers.getExceptionMapper(cause.getClass());</div><div> if (mapper != null) {</div><div> return mapper.toResponse(cause);</div><div> } else if (cause instanceof WebApplicationException) {</div><div> return ((WebApplicationException)cause).getResponse();</div><div> }</div><div> }</div><div><br></div><div> return Response.serverError().build();</div><div> }</div><div>}</div><div><br></div></div><div><br></div><div><br><blockquote><div class="ecxhmmessage" style="font-size: 10pt; font-family: Verdana;">---<br>The first thing i tried was using the servlet exception rules (im using that yet with the mapper for EJBException) but happens the same with glassfish dumping the exception:<br><br><error-page><br> <exception-type>com.sun.jersey.api.container.MappableContainerException</exception-type><br> <location>/jsp/ejbException.jsp</location><br> </error-page><br> <error-page><br> <error-code>500</error-code><br> <location>/jsp/ejbException.jsp</location><br> </error-page><br><br>---<br>When a user sends a request, jersey selects wich method must attend the user and jersey know which one will be the response type by default. Is there any method for me, to know wich one will be? (httpContext.getResponse().getMediaType() returns null)<br><br>Thanks Paul!<br><br>> Date: Thu, 1 Oct 2009 10:33:48 +0200<br>> From:<span class="ecxApple-converted-space"> </span><a href="mailto:Paul.Sandoz@Sun.COM">Paul.Sandoz@Sun.COM</a><br>> To:<span class="ecxApple-converted-space"> </span><a href="mailto:users@jersey.dev.java.net">users@jersey.dev.java.net</a><br>> Subject: Re: [Jersey] ExceptionMapper and Viewable<br>><span class="ecxApple-converted-space"> </span><br>> On Sep 30, 2009, at 1:44 PM, Jordi Domingo wrote:<br>><span class="ecxApple-converted-space"> </span><br>> ><br>> > Hi :)<br>> ><br>> > I'm trying to make an ExceptionMapper that returns the response<span class="ecxApple-converted-space"> </span><br>> > expected by the client. I dont know how i can return a Viewable or a<span class="ecxApple-converted-space"> </span><br>> > JSON response because i dont have access to any object with that<span class="ecxApple-converted-space"> </span><br>> > information<br>> ><br>> > public Response toResponse(EJBException exception) {}<br>> ><br>><span class="ecxApple-converted-space"> </span><br>> If a resource method was selected for invocation then the Content-Type<span class="ecxApple-converted-space"> </span><br>> of the response will have been selected if the @Produces specifies a<span class="ecxApple-converted-space"> </span><br>> concrete (non-wild card) media type. So if the Content-Type is present<span class="ecxApple-converted-space"> </span><br>> you can look at that.<br>><span class="ecxApple-converted-space"> </span><br>> You can inject Jersey's HttpContext on the ExceptionMapper and in the<span class="ecxApple-converted-space"> </span><br>> toResponse method you can do:<br>><span class="ecxApple-converted-space"> </span><br>> MediaType m = httpContext.getResponse().getMediaType();<br>><span class="ecxApple-converted-space"> </span><br>> You can also get access to the acceptable headers by doing:<br>><span class="ecxApple-converted-space"> </span><br>> httpContext.getRequest().getAcceptableMediaTypes()<br>><span class="ecxApple-converted-space"> </span><br>> (That method is a method on javax.ws.rs.core.HttpHeaders, which can be<span class="ecxApple-converted-space"> </span><br>> injected if required rather than referring to something Jersey<span class="ecxApple-converted-space"> </span><br>> specific).<br>><span class="ecxApple-converted-space"> </span><br>><span class="ecxApple-converted-space"> </span><br>> > On another side, when Jersey finds an Exception (not Runtime) that<span class="ecxApple-converted-space"> </span><br>> > is not mapped, forwards it to the ServletContainer, thats fine.<br>><span class="ecxApple-converted-space"> </span><br>> Any RuntimeException that is not mapped will be re-thrown and it will<span class="ecxApple-converted-space"> </span><br>> pass through Jersey's Servlet layer to the Servlet framework from<span class="ecxApple-converted-space"> </span><br>> where it can be mapped using Servlet-based rules.<br>><span class="ecxApple-converted-space"> </span><br>> Any checked exception that is not mapped will be wrapped around a<span class="ecxApple-converted-space"> </span><br>> Jersey runtime exception (ContainerException) and that will be passed<span class="ecxApple-converted-space"> </span><br>> to Jersey's Servlet layer and wrapped in a ServletException exception<span class="ecxApple-converted-space"> </span><br>> and re-thrown.<br>><span class="ecxApple-converted-space"> </span><br>><span class="ecxApple-converted-space"> </span><br>> > When i do the same with an EJBException (SystemException) I dont<span class="ecxApple-converted-space"> </span><br>> > know how to achieve the same behavior. This is my code for testing:<br>> ><br>> > public Response toResponse(EJBException exception) {<br>> > final Exception cause = exception.getCausedByException();<br>> ><br>> > return new WebApplicationException(cause).getResponse();<br>> > }<br>> ><br>><span class="ecxApple-converted-space"> </span><br>> I am not sure i understand what you want to achieve.<br>><span class="ecxApple-converted-space"> </span><br>> Do you want the EJBException to be passed through to the Servlet<span class="ecxApple-converted-space"> </span><br>> framework?<br>><span class="ecxApple-converted-space"> </span><br>> Paul.<br>><span class="ecxApple-converted-space"> </span><br>> ---------------------------------------------------------------------<br>> To unsubscribe, e-mail:<span class="ecxApple-converted-space"> </span><a href="mailto:users-unsubscribe@jersey.dev.java.net">users-unsubscribe@jersey.dev.java.net</a><br>> For additional commands, e-mail:<span class="ecxApple-converted-space"> </span><a href="mailto:users-help@jersey.dev.java.net">users-help@jersey.dev.java.net</a><br>><span class="ecxApple-converted-space"> </span><br><br><hr>Charlas más divertidas con el nuevo<span class="ecxApple-converted-space"> </span><a href="http://download.live.com">Windows Live Messenger</a></div></blockquote></div><br> <br /><hr />Charlas más divertidas con el nuevo <a href='http://download.live.com' target='_new'>Windows Live Messenger</a></body>
</html>
--_582c2ee6-df4f-4188-a06a-0bbd88b59b59_--