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