在另一个控制器内重用弹簧服务控制器功能

时间:2013-10-30 11:11:33

标签: java spring spring-mvc autowired

我有服务控制器哪个功能我想在另一个控制器中重用。这是我的服务控制器

@Controller
@Service
@Scope("session")
public class Controller1{
...
}

这是我的第二个控制器

 @Controller
 public class Controller2 {
     @Autowired
     private Controller1 adminController;
     ...
 }

但我得到的例外情况是:

  

创建名为'adminController'的bean时出错:当前线程的作用域'session'无效;考虑为这个bean定义一个范围代理,如果你打算从一个单独的引用它;

我认为这是因为Controler1是会话范围的bean而Controller2是应用程序。如何在Controller2中重用Controller1功能?感谢。

3 个答案:

答案 0 :(得分:1)

你可以在你的xml配置文件中使用aop:scoped-proxy for controller1

 <bean id="controller1" class="...Controller1" scope="session">
    <aop:scoped-proxy />
 </bean>

查看spring 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的意思,但如果你想在两个控制器中共享一个方法,为什么不定义一个定义这个方法的抽象父类,并从这个父类扩展两个控制器?