spring两个方法具有相同的URL映射

时间:2016-02-17 12:23:32

标签: java spring

我有2个类,有2个相同的URL映射:

@RequestMapping(value = "/topics/{id}", method = RequestMethod.GET)
public ModelAndView methodA(@PathVariable(TOPIC_ID) Long topicId) {
    ...
}
//
@RequestMapping(value = "/topics/{id}", method = RequestMethod.GET)
public ModelAndView methodB(@PathVariable(TOPIC_ID) Long topicId) {
    ...
}

MethodB是一个动态加载的类。我只想在methodB不可用的情况下使用methodA。如果methodB可用,Spring只使用它。 我怎么能这样做。

3 个答案:

答案 0 :(得分:1)

有时候URL映射来自一个包,有时来自另一个包,这听起来很混乱。你为什么不像Ken Bekov在评论中建议的那样做,只有一个类,其中有URL映射,并让该类动态决定使用哪个实现?所以像这样:

@RequestMapping(value = "/topics/{id}", method = RequestMethod.GET)
public ModelAndView methodA(@PathVariable(TOPIC_ID) Long topicId) {
 Class classWithMapping;
 try {
   classWithMapping = Class.forName("class.that.MayNotExist");
 } catch(ClassNotFoundException cnfe) {
   classWithMapping = MyDefaultClass.class;
 }
 // ....
}

...然后使用反射或Spring的应用程序上下文实例化classWithMapping

答案 1 :(得分:1)

spring方式是只有一个控制器映射到一个URL,并注入实际执行该作业的动态类:

class A {
    @Autowired(required = false)
    class B b; // inject by Spring or by ... or not at all
    ...
    @RequestMapping(value = "/topics/{id}", method = RequestMethod.GET)
    public ModelAndView methodA(@PathVariable(TOPIC_ID) Long topicId) {
        if (b != NULL) {  // class B has been found and injected
            return b.methodB(topicId)
        }
        // fallback ...
        ...
    } 
}

class B {
    // NO @RequestMapping here !
    public ModelAndView methodB(@PathVariable(TOPIC_ID) Long topicId) {
        ...
    }
}

答案 2 :(得分:0)

在spring中,控制器对象是spring上下文中的单例bean,并且在启动期间初始化上下文。因此,如果动态加载类,则不会应用请求映射。所以你不能做你说的话。

ZeroOne的上述解决方案是我认为的唯一方式。