[undertow-dev] How do I handle HTTP Methods in Undertow?

Luke Ambrogio gryzlaw at hotmail.com
Thu Sep 25 04:19:55 EDT 2014


Thanks Stuart,

I think that's exactly what I need, since annotation as you say might not
be necessary.

Can you specify which version I would need to include in the pom please?
Since the one I am using (1.0.14.Final) doesn't seem to include it and
maven doesn't seem to know about 1.2.0.Beta1-SNAPSHOT.

Cheers

On Thu, Sep 25, 2014 at 2:00 AM, Stuart Douglas <sdouglas at redhat.com> wrote:

> Undertow is intended to be a lightweight web server rather than a
> container, so it does not really have any annotation processing facilities
> built in, however it should be fairly easy to implement something similar
> on top of Undertow.
>
> Undertow has a handler called io.undertow.server.RoutingHandler, that
> routes requests based on method and path. If you use this handler it should
> be possible to build a handler chain based on annotations on the handler
> classes.
>
> Note that you don't want to be using reflection in the handleRequest
> method, as reflection is relatively slow. Instead the best approach is to
> read the annotations and boot time and build up the routing map while the
> server is starting.
>
> Stuart
>
> Luke Ambrogio wrote:
>
>> So I've decided to start using Undertow, both as an experiment and due
>> to the great results it achieved in benchmark tests. And while I think
>> it's fantastic there's a feature which is either missing or I can't find.
>>
>> I want to develop a RESTful web service so it's important for me to
>> identify which HTTP method is being called. Now I can get this from
>> RequestMethod in the HttpServerExchange parameter but if had to that for
>> every handler that would become tedious.
>>
>> My solution, which works but feels wrong, is this:
>>
>> Created an annotation interface called HTTPMethod:
>>
>> |@Retention(RetentionPolicy.RUNTIME)
>> @Target(ElementType.METHOD)
>> public  @interface  HTTPMethod  {
>>
>> public  enum  Method  {
>>
>>      OTHER,  GET,  PUT,  POST,  DELETE
>> }
>>
>> Method  method()  default  Method.OTHER;|
>>
>> an "abstract" class (which is not abstract):
>>
>> |public  abstract  class  RESTfulHandler  implements  HttpHandler  {
>>
>> @Override
>> public  void  handleRequest(HttpServerExchange  hse)  throws  Exception
>> {
>>
>>      for  (Method  method:  this.getClass().getDeclaredMethods())  {
>>
>>          // if method is annotated with @Test
>>          if  (method.isAnnotationPresent(HTTPMethod.class))  {
>>
>>              Annotation  annotation=  method.getAnnotation(
>> HTTPMethod.class);
>>              HTTPMethod  test=  (HTTPMethod)  annotation;
>>
>>
>>              switch  (test.method())  {
>>                  case  PUT:
>>                      if  (hse.getRequestMethod().toString().equals("PUT"))
>> {
>>                          method.invoke(this);
>>                      }
>>                      break;
>>
>>                  case  POST:
>>                      if  (hse.getRequestMethod().toString().equals("POST"))
>> {
>>                          method.invoke(this);
>>                      }
>>                      break;
>>
>>                  case  GET:
>>                      if  (hse.getRequestMethod().toString().equals("GET"))
>> {
>>                          method.invoke(this);
>>                      }
>>                      break;
>>
>>                  case  DELETE:
>>                      if  (hse.getRequestMethod().toString().equals("DELETE"))
>> {
>>                          method.invoke(this);
>>                      }
>>                      break;
>>                  case  OTHER:
>>                      if  (hse.getRequestMethod().toString().equals("OTHER"))
>> {
>>                          method.invoke(this);
>>                      }
>>                      break;
>>              }
>>              if  (test.method()  ==  HTTPMethod.Method.PUT)  {
>>                  method.invoke(this);
>>              }
>>          }
>>      }
>> }|
>>
>> }
>>
>> and an implementation of both the above:
>>
>> |public  class  ItemHandler  extends  RESTfulHandler{
>>
>> @HTTPMethod(method=GET)
>> public  void  getAllItems()
>> {
>>      System.out.println("GET");
>> }
>>
>> @HTTPMethod(method=POST)
>> public  void  addItem()
>> {
>>      System.out.println("POST");
>> }
>>
>> @HTTPMethod
>> public  void  doNothing()
>> {
>>      System.out.println("OTHERS");
>> }|
>>
>> }
>>
>> Now as I said, it works, but I'm sure that the abstract class and it's
>> implementation have something missing so that they glue correctly. So my
>> question is two fold:
>>
>> 1) Is there a better / proper way to filter HTTP requests in Undertow?
>> 2) What is the correct way of using annotations correctly correctly in
>> the above case?
>>
>> Thanks
>>
>>
>> _______________________________________________
>> undertow-dev mailing list
>> undertow-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/undertow-dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20140925/3144f064/attachment.html 


More information about the undertow-dev mailing list