我有服务控制器哪个功能我想在另一个控制器中重用。这是我的服务控制器
@Controller
@Service
@Scope("session")
public class Controller1{
...
}
这是我的第二个控制器
@Controller
public class Controller2 {
@Autowired
private Controller1 adminController;
...
}
但我得到的例外情况是:
创建名为'adminController'的bean时出错:当前线程的作用域'session'无效;考虑为这个bean定义一个范围代理,如果你打算从一个单独的引用它;
我认为这是因为Controler1是会话范围的bean而Controller2是应用程序。如何在Controller2中重用Controller1功能?感谢。
答案 0 :(得分:1)
你可以在你的xml配置文件中使用aop:scoped-proxy for controller1
<bean id="controller1" class="...Controller1" scope="session">
<aop:scoped-proxy />
</bean>
答案 1 :(得分:1)
这两个注释@Controller
和@Service
都作为@Component
的特化,它允许通过类路径扫描自动检测实现类。 @Controller
通常与带注释的处理程序方法结合使用来处理http请求。因此,您不必在同一个班级上使用@Controller
和@Service
。您可以安全地删除@Service
。
现在,如果要将HTTP会话作用域bean注入另一个bean,则必须注入AOP proxy
来代替作用域bean。
也就是说,您需要注入一个代理对象,该对象公开与作用域对象相同的公共接口,但也可以从相关作用域(在此场景中,HTTP会话)和委托方法调用中检索真实的目标对象到真实物体上。因此,为了使其有效,请将@Scope
注释Controller1
更改为:
@Controller
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Controller1{
...
}
答案 2 :(得分:0)
这取决于你对functionnality的意思,但如果你想在两个控制器中共享一个方法,为什么不定义一个定义这个方法的抽象父类,并从这个父类扩展两个控制器?