2011-08-09 42 views
5

estoy teniendo problemas en curso de configurar mi controlador de primavera para asignar a determinadas direcciones URL, y lo tengo a un escenario bastante simple, que creo que debería estar trabajando:Spring MVC - Mapeo controlador de direcciones URL utilizando Anotaciones

I estoy configurando mi clase de controlador utilizando anotaciones, y se ve de la siguiente manera:

@Controller 
@RequestMapping(value = "/question/**") 
public class QuestionController 
{ 

    /** 
    * Method to build users questions list 
    * 
    * @param request 
    * @param response 
    * @return 
    * @throws Exception 
    */ 
    @RequestMapping("/list") 
    public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception{ 
     //Display Questions List 
    } 
} 

no hay ninguna configuración adicional del controlador, simplemente tengo la configuración <mvc:annotation-driven/> y la configuración <context:component-scan>.. en mi config webmvc, por lo que el controlador está automáticamente detectado

Ahora, cuando navego a /question/list, las aplicaciones no pueden encontrar el recurso y aparece un error ResourceNotFound. Sin embargo, si navego a /question/question/list, la aplicación carga la página que esperaría correctamente.

¿Alguna idea de por qué esto está dirigiendo al método usando /question/question/list?


Después de esto he intentado añadir la configuración de mi config webmvc para obligar a todos los RequestMappings utilizar los parámetros alwaysUseFullPath = true, lo hice de la siguiente manera:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:order="3"> 
     <property name="alwaysUseFullPath" value="true" /> 
    </bean> 

Esta vez, cuando navego a/question/list aún no carga la página correcta, pero los registros muestran que Spring al menos identifica el controlador correcto, pero simplemente no encuentra el método (antes ni siquiera encontró el controlador basado en la URL):

2011-08-09 18:02:27,885 [http-8080-3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Matching patterns for request [/question/list] are [/question/**/list/, /question/**/list, /question/**/, /question/**] 
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapping [/question/list] to handler '[email protected]23' 
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - Last-Modified value for [/microblog/question/list] is: -1 
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'microblog' processing GET request for [/microblog/question/list] 
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.handler.SimpleMappingExceptionResolver - Resolving exception from handler [[email protected]23]: org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException: No matching handler method found for servlet request: path '/list', method 'GET', parameters map[[empty]] 
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.handler.SimpleMappingExceptionResolver - Resolving to view 'resourceNotFound' for exception of type [org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException], based on exception mapping [.NoSuchRequestHandlingMethodException] 
2011-08-09 18:02:27,887 [http-8080-3] DEBUG org.springframework.web.servlet.handler.SimpleMappingExceptionResolver - Exposing Exception as model attribute 'exception' 

Me parece que es algo relativamente simple lo que intento lograr al conectar un Controlador a una URL usando las anotaciones, pero no está funcionando correctamente - alguien se ha encontrado con esto o ha visto errores flagrantes ¿de mi parte?


ACTUALIZACIÓN

me han hecho algunos progresos en mis investigaciones.

En mi web.xml que definen la correlación de servlet de la siguiente manera:

<servlet-mapping> 
     <servlet-name>microblog</servlet-name> 
     <url-pattern>/question/*</url-pattern> 
    </servlet-mapping> 

Si quito este mapeo de servlets, (todavía tengo un servlet-mapping que mapea todas .html al mismo servlet) y el cambio la URL que estoy usando para /question/list.html luego funciona (también cambio la asignación de nivel de método de la anotación @RequestMapping en mi método list() en el controlador de pregunta al /list.html).

En resumen:

  1. tengo correlación de servlet /question al contexto Web

  2. tengo otra asignación de /question a la QuestionController

  3. Tengo un mapeo nivel de método para mi lista método de /list

Ahora no quiero que mis URL terminen en .html para estos casos. ¿Alguien sabe cómo puedo solucionar este problema? Parece como si tal vez el servlet-mapping se estropea el emparejado /question cadena a partir de la URL (de ahí /question/list no trabajar, pero trabajar /question/question/list)

+2

conjunto / para direcciones URL sin html – Gengzu

+0

Si uso eso, entonces redirige toda mi imagen, recursos CSS, etc. al controlador, por lo que no los encuentra (todas mis imágenes están en/images/.. etc) - así que cuando cargué la página no hay imágenes ni estilo css. ¿Alguna idea de cómo puedo asignar solo las URL al controlador sin la necesidad de duplicar la ruta en la URL? – rhinds

+1

Mueva sus archivos a la carpeta de arriba, no a la carpeta WEB-INF. – Gengzu

Respuesta

4

conjunto

<url-pattern>/</url-pattern> 

para las direcciones URL sin html y utilizar

<mvc:resources mapping="/resources/**" location="/resources/" /> 

de recursos como Css, .jpg, etc.

2

No es necesario el/** en el mapeo controlador.

La asignación a @RequestMapping(value = "/question") le llevará a este controlador.

/list se anexarán a /question.

Cuando agrega el /** como lo tiene, le está diciendo que busque una ruta de base de la pregunta seguida de cualquier cosa y luego agregue /list hasta el final.

Espero que ayude.

+0

Gracias, ya estaba haciendo esto, pero en la desesperación traté de agregar el "/ **" en un intento de reflejar la forma en que se habría configurado en la configuración XML anterior. En ambos casos, sigo obteniendo los mismos resultados de cualquier manera. – rhinds

+0

También he actualizado la pregunta original con algunas actualizaciones adicionales con respecto a algunos descubrimientos que realicé en el mapeo de servlets web.xml – rhinds

0

también me encuentro con este problema, pero no acaba de desarrollar llamar a Rest API y luego al error: "org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException: no se encontró un método de controlador coincidente para la solicitud de servlet ....."

Resuelvo este problema agregando "Aceptar: aplicación/json" en el encabezado de la solicitud en la herramienta del cliente de reposo. Espero que te ayude.

Cuestiones relacionadas