Asignación ambigua encontrado con ControllerClassNameHandlerMapping

Cómo asignar las solicitudes de los métodos sin el expreso anotaciones en la parte superior de los métodos? Por ejemplo, la siguiente solicitud:

http://somedomain:8080/SampleSpring/access/loginFailed

debe ser asignado a

«loginFailed» método de «AccessController» sin la necesidad explícita de anotación en el método como:

@RequestMapping("/access/loginFailed")

Aquí está mi primavera de configuración:

<context:component-scan base-package="com.robikcodes.samplespring"/>
<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
        <property name="basePackage" value="com.robikcodes.samplespring.controller"/>
        <property name="caseSensitive" value="true"/>
        <property name="defaultHandler">
            <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
        </property>
</bean>   

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"/>
            <property name="suffix" value=".jsp"/>
</bean>

Aquí está mi controlador:

@Controller
public class AccessController{

    @RequestMapping(method = RequestMethod.GET)
    public void login(ModelMap m) {}

    @RequestMapping(method = RequestMethod.GET)
    public String loginFailed(ModelMap m) {
        m.addAttribute("error", "true");
        return "access/login";
    }

    @RequestMapping(method = RequestMethod.GET)
    public String logout(ModelMap m) {
        m.addAttribute("logoutStatus","true");
        return "access/login";
    }
}

Tengo el siguiente error (parece como único método de inicio de sesión se ha asignado correctamente):

org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'accessController' bean method 
public java.lang.String com.robikcodes.samplespring.controller.AccessController.logout(org.springframework.ui.ModelMap)
to {[],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'accessController' bean method
public void com.robikcodes.samplespring.controller.AccessController.login(org.springframework.ui.ModelMap) mapped.
  • Aunque una cuestión diferente, pero esta respuesta también se aplica a su pregunta.
  • Sí lo hace. No sé cómo utilizar DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter en lugar de RequestMappingHandlerMapping y RequestMappingHandlerAdapter. Incluso si hago sustituya, todavía están en desuso. ¿Significa esto que no hay manera de usar los nombres de método sin utilizar obsoleto clases?
  • De hecho, RequestMappingHandlerAdapter no es obsoleta y no se debe usar y también es compatible método completo de las firmas.
  • Me refería a DefaultAnnotationHandlerMapping y AnnotationMethodHandlerAdapter están en desuso. En el enlace que usted señaló, Rossen dice: «El nuevo HandlerMapping-HandlerAdapter par está habilitado por defecto». Entonces, ¿por qué es mi código no funciona? Necesito declarar RequestMappingHandlerAdapter explícitamente? Si es así, cómo?
InformationsquelleAutor coolscitist | 2013-12-23

1 Kommentar

  1. 5

    Estás usando ControllerClassNameHandlerMapping con la suposición de que no es la correcta; de Java doc:

    Implementación de HandlerMapping que sigue a una simple convención para
    la generación de URL asignaciones de ruta de acceso de la clase de los nombres de los registrados
    Controlador de granos así como @Controlador anotado frijoles.

    La documentación no dice que también sigue los nombres de método. La principal referencia de la comparación de «asignaciones de controlador» para el controlador es el @RequestMapping anotaciones poner en sus métodos. Así, con su controlador de Primavera lee como:

    {methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}

    para todos los métodos definidos en AccessController que tiene la siguiente @RequestMapping:

    @RequestMapping(method = RequestMethod.GET)

    Es por eso que usted ve la ambigüedad de la excepción.

    A mi entender, la solución más limpia es el uso de value atributo de @RequestMapping definir diferentes solicitud Uri. No es realmente recomendable para ir en busca de una solución que trata de la solicitud de mapa URIs para los nombres de método.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea