Como configurar Spring full REST y recursos estáticos

Como configurar Spring full REST y recursos estáticos


Este tema que me ha dado bastantes dolores de cabeza... sinceramente las cosas más sencillas son siempre las que más molestias ocasionan. Mi aplicación es un backend JSON Rest con Spring en el que tenia desplegado una serie de utilidades (esos pequeños salvavidas en forma de .jsp, como gestión de logs en tiempo de ejecución, gestor de base de datos web, entre otros y recursos estáticos que te ayudan a superar tu día a día). Justo el día que vas a hacer uso de estas utilidades te das cuenta que han dejado de funcionar ¿Por que?.

HTTP Status 405 - Request method 'GET' not supported

Los problemas vienen cuando comienzas a usar <mvc:annotation-driven />: y es entonces cuando los recursos estáticos deja de ser servidos.

Para solucionarlo en primer lugar, configuramos las localizaciones estáticas que deben de ser servidas con <mvc:resources /> en nuestro applicationContext (asociado al Spring DispatcherServlet en nuestro web.xml) :

<mvc:resources mapping="/uri/match/**" location="/phisical/location" />

Donde <mvc:resources /> recibe dos parámetros:

  • mapping, asociado a la URI desde la que serán servidos los recursos.
  • location, ubicación de los ficheros dentro de nuestro webapps o raíz de vuestro .war.

Ahora toca configurar nuestra aplicación para que haga uso del Default Servlet en vez del DispatcherServlet de Spring. Para ello en nuestro web.xml agregamos tantas localizaciones como localizaciones <mvc:resources /> definiéramos, un ejemplo:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/uri/match/*</url-pattern>
</servlet-mapping>

No hace falta definir default como servlet en nuestro web.xml ya que esté está disponible por defecto en nuestro servidor (al menos en Tomcat 6 y 7).

Y a partir de este momento, todo vuelve a funcionar como venia haciéndolo hasta el momento. En cualquier caso, tened cuidado por que seguramente tengas que ajustar un poco los patrones de URL para cada caso.