Hi
On 11/09/12 20:41, Kiren Pillay wrote:
Hi All,
We have a project where the customer really doesn't want to go the full
REST route. We are basically migrating a Corba IDL interface with 100+
functions over to web services and they want a generic URL to send requests
through to.
For the new implementation, I want to implement the following scheme:
/rest/function/function1?params=..
/rest/function/functionN?params=..
This way each function can be mapped directly to the the servicing
component, where each component is in a different class. . However from
what I'm seeing, if the root resource is "function" for example, the
resource component servicing the request may not be in a different
implementing class. When I call the URL in the second function, I get "No
operation matching request path "/RestTest/rest/function/functionN" Is this
the expected behaviour?
I know I'm fighting against the way JAX-RS was meant to be used, but is
there a way the above scheme can be made to work?
This issue has been raised a number of times, yes, by default, when
multiple root resources share the same top-level Path value, the first
matching root resource is selected. JAX-RS 2.0 fixes this issue - I
might be able to get the fix in time for 2.7.0 - but more likely in
2.7.1 as the update might be sensitive.
In meantime, here are few possible options:
- If every root resource has only a single function, then having a
top-level Path like "/function/function1", etc, will do
- Register a custom ResourceComparator (as jaxrs:provider):
http://cxf.apache.org/docs/jax-rs-basics.html#JAX-RSBasics-Customselectionbetweenmultipleresources
This can be the simplest option - you can use it to 'order' two root
resource representations.
- perhaps consider introducing a root resource mediator, which will use
a subresource locator, ex, it will return MyRestTest for "/function",
OtherService for "/function1", etc
As a side note, you might want to consider using a no-annotations
approach given that the legacy Corba services are exposed:
http://cxf.apache.org/docs/jax-rs-advanced-features.html#JAX-RSAdvancedFeatures-RESTfulserviceswithoutannotations
HTH, Sergey
Regards
Kiren
=================================================
@Service("testService")
public class MyRestTest {
@GET
@Produces("text/xml")
@Path("/function")
public MyType dummyFunction(){
MyType mt=new MyType();
mt.key="key";
mt.value=
"OKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK";
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mt;
}
===========================================================
@Service("otherService")
@Path("/function")
public class OtherService {
@GET
@Produces("text/xml")
@Path("/functionN")
public MyType dummyFunction(){
MyType mt=new MyType();
mt.key="key";
mt.value= "Other";
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mt;
}
}
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com