Posts Tagged ‘spring

27
Feb
08

sobre spring 2.5, anotaciones y expresiones regurales

Una de las nuevas características de la última versión estable de Spring MVC es la posibilidad de configurar la relación entre una url y el método que se ejecuta mediante la anotación @RequestMapping. Sobre las nuevas características hay muy buenos artículos, como el aparecido en infoq o en el mismo blog de springsource. Pero lo que estos artículos no explican es como configurar nuestra aplicación para que esta anotación acepte como valores expresiones regulares.

En este artículo vamos describir los componentes que se encargan de estas relaciones y como añadir nuevas clases para poder trabajar con expresiones regulares.

El primer paso es crear una clase que se encargue de machear las expresiones que vamos a identificar como rutas válidas. Por defecto la clase AntPathMatcher se encarga de machear expresiones tipo ant(‘/**’, ‘/home/*’, ..) como no queremos perder esta funcionalidad podemos extender nuestra clase de esta, sobreescribir el método doMatch y marcarla como un componente con la anotación @Component:


@Component("regexPathMatcher")
public class RegexPathMatcher extends AntPathMatcher {
  @Override
  protected boolean doMatch(String pattern, String path, boolean fullMatch) {
    boolean match = super.doMatch(pattern, path, fullMatch);
      if (!match) {
        jregex.Pattern pat = new jregex.Pattern(pattern);
        match = pat.matcher(path).matches();
      }
    return match;
  }
}

Las clases encargadas de relacionar los controladores con las rutas que resuelven siempre extienden de la interfaz HandlerAdapter. En el caso de que estemos usando este sistema de anotaciones la clase por defecto encargada será AnnotationMethodHandlerAdapter. A esta clase le tenemos que indicar que el componente encargado de machear las rutas ya no es el de por defecto, para esto declararemos este componente en el xml de configuración y le inyectaremos el nuevo matcher:


<bean id="regexMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="pathMatcher" ref="regexPathMatcher"/>
</bean>

El último componente que hay que configurar es el encargado de decidir si la ruta que llega de una petición es válida en la aplicación. Estos componentes extienden de la clase abstracta AbstractHandlerMapping, en el caso de usar anotaciones el componente por defecto es DefaultAnnotationHandlerMapping. Para configurarlo dentro del xml tendremos que añadir:


<bean id="regexUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  <property name="alwaysUseFullPath" value="true"/>
  <property name="pathMatcher" ref="regexPathMatcher"/>
</bean>

Una vez hecho esto nuestra aplicación soportará rutas un poco más elaboradas como estas:


@RequestMapping("/home(/page({=page}\\d+))?")
@RequestMapping("/user/({=user}[\\w\\d_-.]+)/(contacts|followers)")
Anuncios