我有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只使用它。 我怎么能这样做。
答案 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的上述解决方案是我认为的唯一方式。