The Response is actually our custom response object in a different namespace (import za.co.pams.messaging.response.Response) from our own packages, not one of the JAXRS objects.
I will download the source and debug, hopefully something comes up! On Mon, Jan 30, 2012 at 6:15 PM, Sergey Beryozkin <[email protected]>wrote: > Hi > > On 30/01/12 16:08, Kiren Pillay wrote: > >> Hi Sergei, >> >> It is returning the correct type ( RechargeRecords ), and this gets >> handled >> via the aspect without any exception (debugged it with my own eyes), but >> an >> exception is getting thrown after the code completion from within the >> framework. >> >> /@Path("/fi/rechargeHistory") >> public interface RechargeHistoryService { >> >> @GET >> @Path("/query/msisdn/{msisdn}"**) >> @Produces("text/xml") >> public RechargeRecords query(@PathParam("msisdn") long msisdn, >> @QueryParam("fromDate") int fromDate, @QueryParam("toDate")int toDate) >> throws PAMSException; >> >> } >> >> > I'm assuming the aspect handler is run after the query(...) method returns > but before the JAX-RS runtime gets the control back, right ? > > Why do you wrap the response object from query(...) in JAX-RS Response > inside the handler ? I think this is what causes the problem > > May be you can provide a basic Maven-based test ? Or checkout the CXF > source and put a breakpoint in JAXRSInvoker ? > > Cheers, Sergey > > On Mon, Jan 30, 2012 at 5:04 PM, Sergey Beryozkin<[email protected]** >> >wrote: >> >> Hi >>> >>> >>> On 30/01/12 14:24, Kiren Pillay wrote: >>> >>> Hi All, >>>> >>>> I have a transaction aspect which returns an object called Response. The >>>> Aspect works fine, ie, when debugging it, the value at the return point >>>> is >>>> exactly as expected and no exceptions are thrown. However, once this is >>>> completed, I am getting a classCast exception with an error trace shown >>>> below: >>>> >>>> za.co.vodacom.pams.messaging.****response.Response cannot be cast to >>>> za.co.vodacom.pams.****rechargerecords.****RechargeRecords >>>> $Proxy69.query(Unknown Source) >>>> sun.reflect.****NativeMethodAccessorImpl.****invoke0(Native Method) >>>> sun.reflect.****NativeMethodAccessorImpl.****invoke(** >>>> NativeMethodAccessorImpl.java:****39) >>>> sun.reflect.****DelegatingMethodAccessorImpl.****invoke(** >>>> DelegatingMethodAccessorImpl.****java:25) >>>> java.lang.reflect.Method.****invoke(Method.java:597) >>>> org.apache.cxf.service.****invoker.AbstractInvoker.**** >>>> performInvocation(** >>>> >>>> AbstractInvoker.java:173) >>>> >>>> At no point in my application code am I doing this cast. RechargeRecords >>>> is >>>> a subclass of Payload, its a Jaxb generated object. >>>> >>>> My problem is that I have no line numbers which tells me exactly where >>>> this >>>> cast occurs. It doesn't look like its in my application code but rather >>>> within the cxf AbstractInvoker's proxy. Any ideas to help me resolve >>>> this >>>> problem (more specifically, finding where the it actually happens) ? >>>> >>>> >>> What does the actual resource method return ? >>> is it Response or some Payload instance ? >>> >>> It appears that the resource method is typed to return Payload while >>> the aspect returns Response so it confuses the runtime a bit... >>> >>> Cheers, Sergey >>> >>> >>> >>> >>> >>> >>> Regards >>>> Kiren >>>> CXF 2.5.1 >>>> >>>> >>>> @Around("execution(@za.co.****pams.bs.PAMSTransaction * *(..))") >>>> public Object recordStats(****ProceedingJoinPoint point) throws >>>> Throwable { >>>> >>>> >>>> Response response = null; >>>> >>>> if (resultObject instanceof Response) { >>>> response = (Response) resultObject; >>>> } >>>> else >>>> if (Payload.class.****isAssignableFrom(resultObject.****getClass())) { >>>> >>>> >>>> response = of.createResponse(); >>>> >>>> Payload payload = (Payload) resultObject; >>>> response.setPayload(payload); >>>> } >>>> >>>> try { >>>> populateSystemInfo(took, response); >>>> response.setMethodSignature(****point.getSignature().toString(****)); >>>> >>>> response.getRequestParams().****addAll(list); >>>> >>>> auditWorker.****createSuccessfulAuditRecord(****response); >>>> >>>> }catch (Throwable e) { >>>> response.setDuration(0); // Test code just to prove no >>>> exceptions >>>> where thrown here >>>> } >>>> >>>> return response; >>>> } >>>> >>>> >>>> >>> -- >>> Sergey Beryozkin >>> >>> Talend Community Coders >>> http://coders.talend.com/ >>> >>> Blog: http://sberyozkin.blogspot.com >>> >>> >>
