You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Andreas Sahlbach <an...@gmail.com> on 2013/10/24 15:02:22 UTC

ETag and Subresources

Hi!

I am wondering if I can combine ETag support and the subresource concept of
CXF.

The problem I have is, that for supporting ETags I have to return an
Response object, if the user is doing a GET on my object.
Example:

@GET // necessary but death of subresources
@Path("/object/id/{id}")
 public Response getObject(@PathParam("id") String id, @Context Request
request)
{
    MyObject result = new MyObject().initializeById(id);
    EntityTag eTag = new EntityTag(result.getEtag());
    ResponseBuilder builder = request.evaluatePreconditions(eTag);
    if (builder != null) {
        return builder.build();
    }
    return Response.ok(result).build();
}

But if I return a response object, I am not able to use the concept of
subresources, because for this my method needs to return the object itself
and not a Response containing an entity of the object.

Is there a way to use both concepts? If I just remove the @GET in the
example above, cxf trys to do subresource calls at the response object.

Cheers,

Andreas


-- 
Andreas Sahlbach

Re: ETag and Subresources

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
On 24/10/13 14:02, Andreas Sahlbach wrote:
> Hi!
>
> I am wondering if I can combine ETag support and the subresource concept of
> CXF.
>
> The problem I have is, that for supporting ETags I have to return an
> Response object, if the user is doing a GET on my object.
> Example:
>
> @GET // necessary but death of subresources
> @Path("/object/id/{id}")
>   public Response getObject(@PathParam("id") String id, @Context Request
> request)
> {
>      MyObject result = new MyObject().initializeById(id);
>      EntityTag eTag = new EntityTag(result.getEtag());
>      ResponseBuilder builder = request.evaluatePreconditions(eTag);
>      if (builder != null) {
>          return builder.build();
>      }
>      return Response.ok(result).build();
> }
>
> But if I return a response object, I am not able to use the concept of
> subresources, because for this my method needs to return the object itself
> and not a Response containing an entity of the object.
>
> Is there a way to use both concepts? If I just remove the @GET in the
> example above, cxf trys to do subresource calls at the response object.
>
Why do you think that the two concepts are not compatible ?
The idea behind subresources is mainly to push some of the root resource 
responsibilities down to sub-resources/objects. Eventually a subresource 
will return a response, wrapped in Response if needed.

Actually, I guess may be you are referring to the fact that Contexts can 
not be injected into sub-resources ?
If so then in your example, I'd say simply do

new MyObject(request);

or

new MyObject().setRequest(request);

or you can do a JAX-RS 2.0 way, use
https://jax-rs-spec.java.net/nonav/2.0/apidocs/javax/ws/rs/container/ResourceContext.html,

not my favorite approach, but it can let you inject a context directly 
into a MyObject field for example, if you do not want to introduce 
setters, etc

HTH, Sergey

> Cheers,
>
> Andreas
>
>