cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gabo Manuel <kman...@solegysystems.com>
Subject Re: [JAXRS][IE] subresource locator feature getting confused
Date Wed, 18 Feb 2009 11:41:00 GMT
Hi Sergey,

I'll wait for the fix. I cannot move the path annotation from the object 
to the service since it is possible that the object involve has a whole 
set of other fields. I also tried the following:

//an extra method
    @GET
    @Path("/search/")
    @WebMethod
    public MyObjects getObjects(){
        //using a list wrapper as advised in the user's guide
        return new MyObjects(new MyObject());
    }

if I invoke http://localhost:8080/cxf/Objects/search/ , "getObject" gets 
invoked.

Gabo

Sergey Beryozkin wrote:
> Hi Gabo
>
> What is happening is that with
>
>> Accept=[image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
>> application/x-shockwave-flash, */*]
>
> the wildcard is the less specific accept type which is checked last, 
> when selecting between multiple matching methods.
> I think what is happening is that when the first specific accept value 
> is tried, the getObject() method is discarded is it inherits text/xml 
> but the subresource method is matched due to the fact the actual 
> method selection is done at a later stage.
>
> Actually, I think there's a flaw in this algorithm (in CXF JAXRS that 
> is), in that all accept types should be tried for all the methods, 
> even if the forst accept type has produced a candidate, in which case 
> */* will ensure that the getObject() is selected too and it will be 
> picked up first on the basis that it's a resource method.
>
> I'll get it fixed for 2.2, but in meantine please move /field1 from 
> MyObject.getField1() to ObjectService.getObjectProperty() and it 
> should fix the problem...
>
> Thanks, Sergey
>
>> Hi All,
>>
>> I was testing the web service I have created and it works without a 
>> hitch when using HttpClient as ... well client. However, if I use 
>> I.E. to check (haven't tested fire fox or any browser yet), I 
>> encounter the following error:
>>
>> javax.ws.rs.WebApplicationException
>>        at 
>> org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:295) 
>>
>>        at 
>> org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:161)
>>        at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:67)
>>        at 
>> org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:56)

>>
>>        at 
>> org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)

>>
>>        at 
>> org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:92)

>>
>>        at 
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:226)

>>
>>        at 
>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:89)

>>
>>        at 
>> org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:99)

>>
>>        at 
>> org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:305)

>>
>>        at 
>> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:138)

>>
>>        at 
>> org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:163)

>>
>>        at 
>> org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXFServlet.java:145)

>>
>>        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
>>        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
>>        at 
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

>>
>>        at 
>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

>>
>>        at 
>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)

>>
>>        at 
>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

>>
>>        at 
>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
>>
>>        at 
>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) 
>>
>>        at 
>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

>>
>>        at 
>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261) 
>>
>>        at 
>> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
>>
>>        at 
>> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)

>>
>>        at 
>> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>>        at java.lang.Thread.run(Thread.java:619)
>>
>> Then I receive a runtime exception client side. What I find weird is 
>> that a method was properly invoked. More specifically, the 
>> subresource locator was used. There are two methods defined and 
>> annotated as follows:
>>
>> @Consumes("*/*")
>> @Produces("text/xml")
>> @Path("/Objects")
>> public class ObjectService{
>>    @GET
>>    @Path("/")
>>    @WebMethod
>>    public Object getObject(
>>            @QueryParam("id")
>>            @WebParam(name="id")
>>            long id) {
>>        //this is the method that I was invoking... supposedly
>>        logger.info("get Object received: " + id);//Note this
>>        return new MyObject();
>>    }
>>
>>    @Path("/")
>>    @WebMethod(exclude=true)
>>    public Object getObjectProperty(
>>            @QueryParam("id")
>>            @WebParam(name="id")
>>            long id) {
>>        //this got invoked ... but should not have been
>>        logger.info("get Object Property received: " + id);//Note this
>>        return getObject(id);
>>    }
>> }
>>
>> @XmlType(name="MyObject")
>> @XmlAccessorType(XmlAccessType.PROPERTY)
>> @XmlRootElement(name="MyObject")
>> public class MyObject {
>>    @GET
>>    @Path("/field1")
>>    public String getField1() {
>>        return "field1";
>>    }
>>    public void setField1() {
>>    }
>> }
>>
>> The debug log shows the following:
>>
>> 2009-02-18 07:38:17,640 | [INFO ][80-1] | get Object Property 
>> received: 1
>> 2009-02-18 07:38:17,640 | [INFO ][80-1] | get Object received: 1
>>
>> I am assuming it is having a problem finding the subresource since 
>> technically, it shouldn't even be the method being invoked. URL being 
>> used is:
>>
>> http://localhost:8080/cxf/Objects/?id=1
>>
>> I am not sure if it helps but maybe the extra headers affects this? 
>> These are not received when HttpClient is used.
>>
>> accept-language=[en-us], user-agent=[Mozilla/4.0 (compatible; MSIE 
>> 7.0; Windows NT 5.1)], accept-encoding=[gzip, deflate], ua-cpu=[x86], 
>> Accept=[image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
>> application/x-shockwave-flash, */*]
>>
>> I am using the following:
>> tomcat 6.0.13
>> java 1.6
>> cxf 2.2-snapshot (Jan 27)
>>
>> Thanks in advance.
>>
>> Gabo 
> ------------------------------------------------------------------------
>
>
> No virus found in this incoming message.
> Checked by AVG - www.avg.com 
> Version: 8.0.237 / Virus Database: 270.10.25/1957 - Release Date: 02/17/09 07:07:00
>
>   

Mime
View raw message