2

在 spring 3.1 中,我错过了使用通用基本控制器进行默认 URL 映射的功能。请看以下示例:

<bean id="appleController" class="de.mw.mwdata.core.web.control.GenericEntityController" />
<bean id="peachController" class="de.mw.mwdata.core.web.control.GenericEntityController" />

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
    <property name="alwaysUseFullPath" value="true"/>
    <property name="mappings">
      <props>
        <prop key="/admin/apple/list.htm">appleController</prop>
        <prop key="/admin/peach/list.htm">peachController</prop>
        <prop key="/admin/strawberry/list.htm">strawberryController</prop>
      </props>
    </property>
</bean> 

<mvc:annotation-driven />

<context:component-scan base-package="de.mw.mwdata.app.admin.web.control" >
</context:component-scan>

这里是 GenericEntityController 和草莓控制器的相关代码片段:

    @RequestMapping("/admin/**")
public class GenericEntityController<E extends AbstractEntity> {

    ...

    @RequestMapping(value = "**/list.htm", method = RequestMethod.GET)
    public ModelAndView list( final HttpServletRequest request, final HttpServletResponse response ) {  
        ...
    }

}

package de.mw.mwdata.app.admin.web.control;
@Controller
@RequestMapping("/admin/strawberry/")
public class StrawberryController extends GenericEntityController<Strawberry> {
    ...
    }
}

所以在春季 3.1 和 SimpleUrlHandlerMapping 之前,我有两个控制器实例(GenericEntityController)用于上下文路径 apple 和 peach 和一个带注释的控制器实例 StrawberryController。到 /list.htm 方法的映射是由 @RequestMapping 完成的,特别是在方法级别上。我的问题:在 spring-mvc 3.1 中,SimpleUrlHandlerMapping 不再适用于带注释的@RequestMapping。我得到以下异常:

Cannot map 'peachController' bean method 
public org.springframework.web.servlet.ModelAndView de.mw.mwdata.core.web.control.GenericEntityController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
to {[/admin/**/list.htm],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'appleController' bean method
public org.springframework.web.servlet.ModelAndView de.mw.mwdata.core.web.control.GenericEntityController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) mapped.

如何在 spring 3.1 中替换此配置?

4

2 回答 2

1

您的 apple 和 peach 控制器都试图映射到相同的路径,因为它们使用相同的支持类。如果你打算为你的控制器使用注解,你应该创建这两个不同的类。如果您想避免这种情况,并希望为苹果和桃子执行相同的逻辑,我建议创建一个 AppleAndPeachController 类,然后在您的 XML 中只定义一个 bean 而不是两个。

无论使用哪种方法,您都不再需要 SimpleUrlHandlerMapping,因为 Spring 将根据您的带注释的控制器自动创建处理程序映射。

如果要将多个路径映射到同一个控制器,@RequestMapping 可以将字符串数组作为参数,如下所示:

@RequestMapping(value={"/admin/apple", "/admin/peach", "/admin/morefruit"})
于 2013-07-23T23:35:26.667 回答
1

首先,非常感谢您的快速回答。是的,目前它们都映射到同一个路径,不幸的是映射到同一个类:因为 Spring 3.1 中的 RequestMappingHandlerMapping 现在对于每个具有 @RequestMapping-annotations 的控制器。那就是问题所在 !在 spring 3.1 之前,我定义的 simpleUrlHandlerMapping 负责这个,它不映射到相同的路径/类。相反,我的 GenericEntityController 的每个创建实例都有一对一的映射。不幸的是,由于向相关控制器注入了“特定于水果”的服务,因此我需要为每个“水果”提供一个 GenericEntityController 的控制器实例。那么如何将多个 URL 路径映射到同一个通用基本控制器类的不同实例?再次感谢每个提示...

于 2013-07-24T20:52:04.823 回答