Nothing built in, thats the way to do it.  You could also have the class 
implement AcceptedByMethod too.  Then the interceptor would only be 
bound to resource methods with your annotation.

On 9/13/2012 4:22 AM, Dieter Cailliau wrote:
> When creating a resource (POST /items) i was a bit annoyed by the fact
> that my implementation has a dependency on jax-rs classes: it uses
> response builder to build a 201 response. This also pollutes my
> service interface, since the return value has to be a Response.
>
> To fix this, i introduced an annotation which gets handled by the
> interceptor code below:
>       
> @RespondWithStatus(status=HttpServletResponse.SC_CREATED,name="Location",value="/items/{return}")
> I'm using this interceptor-construction to hack the response and turn
> it into a 201 with a Location header (leaving the entity like it is).
>
> Now my service implementation class or interface has no dependencies
> on jax-rs (it just returns a String, which will be used to replace the
> {return} placeholder.
> I'ld like to get some feedback on this trick. Is there anything
> "built-in" that i could have used?
>
> @Provider
> @ServerInterceptor
> public class RespondWithStatusAndHeaderInterceptor implements
> PostProcessInterceptor {
>
>       @Context HttpServletRequest req;
>       
>       public void postProcess(ServerResponse arg0) {
>               for (Annotation a : arg0.getAnnotations()) {
>                       if (a.annotationType().equals(RespondWithStatus.class)){
>                               RespondWithStatus x = (RespondWithStatus) a;
>                               String template = x.value();
>                               String rv =  arg0.getEntity().toString();
>                               int u = template.indexOf("{return}");
>                               int y = template.indexOf('?');
>                               rv = (u < y || y == -1) ?
> org.jboss.resteasy.util.Encode.encodePath(rv) :
> org.jboss.resteasy.util.Encode.encodeQueryParam(rv);
>                               String p = 
> req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+req.getContextPath()+req.getServletPath();
>                               String rep = template.replace("{return}",rv);
>                               if (!"".equals(x.name())) {
>                                       arg0.getMetadata().add(x.name(), p+rep);
>                               }
>                               arg0.setStatus(x.status());
>                       }
>               }
>       }
>       
>       @Retention(RetentionPolicy.RUNTIME)
>       public static @interface RespondWithStatus {
>               int status();
>               String name() default "";
>               String value() default "";
>       }
>       
> }
>
> ------------------------------------------------------------------------------
> Live Security Virtual Conference
> Exclusive live event will cover all the ways today's security and
> threat landscape has changed and how IT managers can respond. Discussions
> will include endpoint security, mobile security and the latest in malware
> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
> _______________________________________________
> Resteasy-users mailing list
> Resteasy-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/resteasy-users
>

-- 
Bill Burke
JBoss, a division of Red Hat
http://bill.burkecentral.com

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Resteasy-users mailing list
Resteasy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/resteasy-users

Reply via email to