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

Stuart Douglas sdouglas at redhat.com
Thu Sep 25 23:31:10 EDT 2014


Oops, this should read 1.1.0.CR2 and 1.1.0.Final

Stuart

Stuart Douglas wrote:
> 1.1.CR2
>
> 1.1.Final should be out soon.
>
> Stuart
>
> Luke Ambrogio wrote:
>> 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
>> <mailto: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<mailto:undertow-dev at lists.jboss.org>
>>          https://lists.jboss.org/__mailman/listinfo/undertow-dev
>>          <https://lists.jboss.org/mailman/listinfo/undertow-dev>
>>
>>
>>
> _______________________________________________
> undertow-dev mailing list
> undertow-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/undertow-dev


More information about the undertow-dev mailing list