Hi,

What exactly is not working when registering proviers programmatically ?
Are exception mappers not invoked ?

I've added a test which tries to follow your example pretty closely :
http://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBeanTest.java

May be you can try to check, just for a test, a resulting ProviderFactory, same 
way it's done in the test I linked to ?

Cheers, Sergey

----- Original Message ----- From: "Vitaly Peressada" <[email protected]>
To: <[email protected]>
Sent: Tuesday, May 12, 2009 3:33 PM
Subject: RE: JAXRS outFaultInterceptors


Hi,

One more question on configuring ExceptionMappers programmatically. Spring 
configuration works as per below

<jaxrs:server id="userService" address="/user">
       <jaxrs:providers>
               <ref bean="authInterceptor"/>
               <ref bean="runtimeExceptionMapper"/>
               <ref bean="infraredExceptionMapper"/>
       </jaxrs:providers>
       <jaxrs:serviceBeans>
               <ref bean="userService"/>
       </jaxrs:serviceBeans>
</jaxrs:server>

but following doesn't

JAXRSServerFactoryBean jaxrsBean = new JAXRSServerFactoryBean();
jaxrsBean.setResourceClasses(this.getClass());
jaxrsBean.setResourceClasses(this.getClass());
jaxrsBean.setResourceProvider(this.getClass(),
   new SingletonResourceProvider(this));

InfraredExceptionMapper iem = new InfraredExceptionMapper();
RuntimeExceptionMapper rem = new RuntimeExceptionMapper();
List<Object> providers = new ArrayList<Object>();
providers.add(iem); providers.add(rem);
jaxrsBean.setProviders(providers);

this.endpointUrl = "http://";
   + InetAddress.getLocalHost().getCanonicalHostName()
   + ":"
   + String.valueOf(this.getListenPort()) + "/";

jaxrsBean.setAddress(this.endpointUrl);
server = jaxrsBean.create();
server.start()

I guess setProviders(...) registers them as entityProviders. How should I 
register them?

Vitaly

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Monday, May 11, 2009 3:47 PM
To: [email protected]
Subject: RE: JAXRS outFaultInterceptors

Hi

It's great. By the way, I think the reason you don't see custom invokers
working is that that enhancement is currently only available in
snapshots, so sorry for the confusion, I'll update the docs

Cheers, Sergey

-----Original Message-----
From: Vitaly Peressada [mailto:[email protected]]
Sent: 11 May 2009 19:01
To: [email protected]
Subject: RE: JAXRS outFaultInterceptors

Thanks for your help, ExceptionMapper does work for me.

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Saturday, May 09, 2009 10:49 AM
To: [email protected]
Subject: RE: JAXRS outFaultInterceptors

So why can't you use ExceptionMappers for this purpose ?
You can register as many mappers as you like. You might want to register
single RuntimeException mapper which will catch everything or you can do

ExceptionMapper<RuntimeException> & ExceptionMapper<MyAppException>,
etc...

But I will also have a look at why fault interceptors are not invoked...


http://cwiki.apache.org/CXF20DOC/jax-rs.html#JAX-RS-Custominvokers

This has to work, I was able to hit a breakpoint in my system test...
Please try

http://svn.apache.org/repos/asf/cxf/trunk/systests/src/test/java/org/apa
che/cxf/systest/jaxrs/security/JAXRSSpringSecurityInterfaceTest.java#tes
tGetBookUser, specifically

see getBook(endpointAddress, "baddy", "baddyspassword", 403);

This one works only due to

http://svn.apache.org/repos/asf/cxf/trunk/systests/src/test/java/org/apa
che/cxf/systest/jaxrs/CustomJAXRSInvoker.java

as otherwise "baddy" would've got 200 response.
You might want to try to quickly build 'mvn install -Pfastinstall' the
source, change

launchServer(BookServerSecuritySpringInterface.class));

to

launchServer(BookServerSecuritySpringInterface.class, true));

and try to hit a breakpoint...

cheers, Sergey
-----Original Message-----
From: Vitaly Peressada [mailto:[email protected]]
Sent: 08 May 2009 21:50
To: [email protected]
Subject: RE: JAXRS outFaultInterceptors

I did see ExceptionMapper but even after implementing it I would not
solve my design problem. I want to find a single central place in CXF
JAXRS stack where I can:

try {
     // invoke service
}
catch (MyAppException me) {
       ServerError se = new ServerError();
       se.setErrorCode(me.getError().ordinal());
       se.setErrorMessage(me.getError().name());
       return Response.error().entity(se).build();
}
catch (RuntimeException re) {
       ServerError se = new ServerError();
       se.setErrorCode(StatusCode.INTERNAL_SERVER_ERROR);
       se.setErrorMessage(StatusCode.INTERNAL_SERVER_ERROR.name());
       return Response.error().entity(se).build();
}

By the way, I also tried
http://cwiki.apache.org/CXF20DOC/jax-rs.html#JAX-RS-Custominvokers but
was not able to hit breakpoint on exception.

Any other ideas? If not, I guess I had to resort to Spring AOP method
interceptors...

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Friday, May 08, 2009 4:29 PM
To: [email protected]
Subject: RE: JAXRS outFaultInterceptors

Hi

Try 1
Use <jaxrs: outFaultInterceptors>
Spring complained

I will investigate.

In meantime, you might want to implement a JAXRS
ExceptionMapper<YourException> instead and register it as a provider.

At the moment one can't register CXF interceptors as JAXRS providers,
one needs to use inInterceptors/outInterceptors instead.

Thanks, Sergey

-----Original Message-----
From: Vitaly Peressada [mailto:[email protected]]
Sent: 08 May 2009 21:10
To: [email protected]
Subject: JAXRS outFaultInterceptors

I am trying to setup a custom exception handler which would catch
exception from service methods and translate them in Response.error and
custom xml.

Try 1
Use <jaxrs: outFaultInterceptors>
Spring complained

Try2
<jaxrs:server id="infraRedAuthenticationServiceJaxrs" address="/user">
                               <jaxrs:providers>
                                               <ref
bean="authInterceptor"/>
                                               <ref
bean="exceptionInterceptor"/>
                               </jaxrs:providers>
                               <jaxrs:serviceBeans>
                                               <ref
bean="userService"/>
                               </jaxrs:serviceBeans>
               </jaxrs:server>

Where exceptionInterceptor is
public class ExceptionInterceptor extends
AbstractPhaseInterceptor<Message> {

     public ExceptionInterceptor() {
           this(Phase.MARSHAL);
     }

     public ExceptionInterceptor(String phase) {
           super(phase);
     }

     @Override
     public void handleMessage(Message message) throws Fault {
           message.toString();

     }

     @Override
     public void handleFault(Message message) {
           super.handleFault(message);
     }

}

but my break points are not hit when throwing exception from service
method
     @GET
     @Path("/generalexception")
     public Response throwUserException() throws Exception {
           throw new Exception("Foo");
     }

Vitaly








Reply via email to