Hi

The only JAX-RS standard way to get UriInfo (or any other @Context annotated) 
values into subresources is to inject them as method
parameters :
void foo(@Context UriInfo ui);
One of the problems with injecting @Context fields in subresources is that 
subresources are detected dynamically, while @Context
values have to be thread-safe and as such the intial injection actually happens 
at the very start-up.

Perhaps we'll need to come up with some sort of CXF-private subresource 
injection technique - Jersey does some tricks in this regard
I believe.

Actually, the other approach is to back-reference userResource from a role resource (roleResource.setUserResource(this) at the spring injection time) and then simply have getUriInfo() on the UserResource. Do you reckon it can work ?

Cheers, Sergey



Hello!
I have spent some days trying to figure out how to get sub-resources working
as I want them to to no avail. I want every resource, including
sub-resources, to contain an attribute which value is the URI of the
resource.

I have an example program where a User can be associated (one-way) to zero
or more Roles.
Consequently, I have an UserResource and a RoleResource.
To retrieve the data of a specific user, I use
http://localhost:8080/CXF_REST_Webservice/users/2/
To list the roles of the same user, I would use
http://localhost:8080/GWT_REST_Webservice/users/2/roles/
So, in my UserResource class, I have a method that is to retrieve the roles
of a user:
(annotations copied from the interface to condense things)

@WebService
@Path("/users/")
@ProduceMime({"application/xml", "application/json"})
public class UserResourceImpl implements UserResource
{
   // A lot of other stuff...

   @Path("{id}/roles/")
   public RoleResource getUserRoles(
       @PathParam("id") final Long inUserId,
       @QueryParam("expandLevel") @DefaultValue("1") final int
inExpandLevel)
       throws UserNotFoundFault
   {
       /* The RoleResource is injected into the UserResource by Spring. */
       return mRoleResource;
   }
}

Both the UserResource and the RoleResource have an instance variable of the
type UriInfo, which is annotated with the @Context annotation. The problem
that occurs is that the UriInfo in the RoleResource returned from the above
method is empty, that is, calling getAbsolutePath() on the UriInfo fails
with a NullPointerException.
When retrieving role resources directly, using an URI like
http://localhost:8080/CXF_REST_Webservice/roles/2, the UriInfo object is not
empty and the call to getAbsolutePath() causes no problems.

One place I suspect I have made a mistake is in the application context file
for the services:
...
   <jaxrs:server id="CXF_REST_Service" address="/">
       <jaxrs:serviceBeans>
           <ref bean="userServiceBean" />
           <ref bean="roleServiceBean" />
       </jaxrs:serviceBeans>
   </jaxrs:server>
...

I tried to run the code on Jersey, the reference implementation of JSR-311,
and there, the UriInfo objects in the UserResource and the RoleResource were
correctly set. There were, however, other problems with Jersey that makes me
prefer CXF, if I only can get the above problem solved.
Many thanks for all the effort people put into CXF and for any help I might
receive!

--
View this message in context: 
http://www.nabble.com/UriInfo-object-in-Sub-Resource-tp19533573p19533573.html
Sent from the cxf-user mailing list archive at Nabble.com.

----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

Reply via email to