2012-08-02 11 views
6

Quiero asignar el controlador spring mvc a la ruta raíz (/**) (y no a la subcarpeta como "/ algo") al hacer excepciones con mvc:resources (abierto a otro método) .sitio web mvc de primavera en la raíz ("/")

Este debería ser el ABC de ese marco, pero aparentemente es algo muy complicado para pedirlo.

Mis app-servlet.xml tiene estas excepciones mapeo de obvios:

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" /> 
<mvc:resources mapping="/robots.txt" location="/robots.txt" /> 

Y tiene este controlador:

import java.util.Date; 

import javax.servlet.http.HttpServletRequest; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
@RequestMapping("/**") 
public class MainController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String service(final HttpServletRequest request) { 
     final String servlet_path = request.getServletPath(); 
     System.out.println(String.format("%s %s", new Date().toString(), servlet_path)); 
     return "test"; 
    } 
} 

Ahora cuando me golpeó "/" o "/ test" o "/ test/página "Obtengo resultados como:

Fri Aug 03 00:22:12 IDT 2012/
Fri Aug 03 00:22:13 IDT 2012 /favicon.ico 

.. ¿ves? service() se llama para /favicon.ico, incluso cuando está explícitamente excluido!

Ahora supongo que hay alguna "prioridad" en el @Controller sobre el XML, aún así, ¿cómo hago que la exclusión funcione?

Un requisito simple: tener el sitio web en "/".

P.S This answer responde a una pregunta muy similar.

Otra nota: Esta pregunta no es sobre el contexto de tomcat.

Respuesta

7

El problema aquí es que el HandlerMapping subyacente registrado con <mvc:resources tiene una prioridad muy baja en comparación con el registrado con <mvc:annotation-driven/>. Si el requisito es simplemente tener algo que responden a "/" una mejor manera, probablemente será tener un @RequestMapping diferente que /** lugar decir lo tienen como /home y definir algo como lo siguiente:

<mvc:view-controller path="/" view-name="home" />

si esto no funcionará, la única otra opción será bajar la prioridad del gestor de mapas subyacente de <mvc:resources, lo que se puede hacer definiendo explícitamente el HandlerMapping, algo complicado pero que se puede hacer.

Updated Aquí está una posible configuración:

Pruebe con sólo esta primera:

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" order="0"/> 
<mvc:resources mapping="/robots.txt" location="/robots.txt" order="0"/> 

Si esto solo no funciona, cambiar <mvc:annotation-driven/> a algo en este sentido para 3.1.x primavera :

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService"></property> 
      <property name="validator"> 
       <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> 
       </bean> 
      </property> 
     </bean> 
    </property> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
     </list> 
    </property> 
</bean> 

<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="order" value="2"></property> 
</bean> 
+0

Su solución se refiere a una sola dirección URL ("/" -> "casa"). Necesito que sea un comodín. Si pudieras elaborar generosamente sobre CÓMO ELEVAR la prioridad de 'mvc: resources' sobre' @ RequestMapping', eso supondría, supongo, que lo resolvería. ¡Gracias! – Poni

+0

Agregó una actualización –

+0

Trabajando - gracias Biju! – Poni

8

Me gustaría aclarar que en lugar de volver a escribir el <mvc:annotation-driven/> se puede cambiar el orden de la declaración de las directivas de controlador:

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" order="0"/> 
<mvc:resources mapping="/robots.txt" location="/robots.txt" order="0"/> 
<mvc:annotation-driven/> 
Cuestiones relacionadas