users@jersey.java.net

Doh! Re: [Jersey] ExceptionMapper and Viewable

From: Paul Sandoz <Paul.Sandoz_at_Sun.COM>
Date: Mon, 05 Oct 2009 14:54:12 +0200

DOH! i should read the email more carefully. Extracted successfully.

Paul.


On Oct 5, 2009, at 2:39 PM, Paul Sandoz wrote:

> Thanks, this is most helpful.
>
> I tried to unrar and it is complaining that a password is required.
> Looks like it might be an issue with the rar app i am using on the
> mac.
>
> UNRAR 3.60 beta 6 freeware Copyright (c) 1993-2006 Alexander
> Roshal
>
> Enter password (will not be echoed) for RestTest.rar:
>
> Encrypted file: CRC failed in /Users/paulsandoz/Downloads/
> RestTest.rar (password incorrect ?)
> No files to extract
>
> I am a bit busy this week with Java EE stuff, so i am unlikely to
> get time to look at this in detail until next week. Hope things are
> not so urgent that it can wait until then.
>
>
> FWIW i think there is a bug in Jersey and any
> MappedContainerException passed to the ServletContainer should re-
> throw the ServletException with the cause set to what was mapped.
>
> Paul.
>
> On Oct 2, 2009, at 6:03 PM, Jordi Domingo wrote:
>
>> 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
>>
>>
>> Charlas más divertidas con el nuevo Windows Live Messenger
>