2013-10-30 136 views
0

我有服務控制器,我希望在另一個控制器中重用該功能。這裏是我的服務控制器在另一個控制器中重用彈簧服務控制器功能

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

這裏是我的第二個控制器

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

但我發現了異常,其表示:

錯誤創建名爲「adminController」豆:範圍'會話「對當前線程無效;考慮爲這個bean定義一個範圍代理,如果你打算從一個單例中引用它;

我認爲這是因爲Controler1是會話範圍的bean而Controller2是應用程序。我如何重用Controller2內的Controller1功能?謝謝。

+2

爲什麼你的類既是@Service和@Controller?這至少會帶來一些警鐘響起......接下來,您需要告訴它在僅指定範圍旁邊創建scoped-proxy。 –

+0

感謝您的意見,我不知道爲什麼這是以這種方式定義:)我只想重用它。我會嘗試@ScopedProxy方法 –

回答

0

它取決於你在functionnality中的意思,但是如果你想在兩個控制器中共享一個方法,爲什麼不定義一個定義這個方法的抽象父類並且從這個父類擴展兩個控制器?

1

你可以使用AOP:作用域代理在您的XML配置文件控制器1

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

看看spring scoped proxy bean

+0

那麼我在這裏使用來控制我在這裏沒有bean定義。 –

+0

我不能添加評論Debojit Saikia的答案,錯誤是因爲你有兩個類Controller1的豆,並且都有相同的requestmapping。你真的需要使用會話範圍的控制器嗎? – karci10

+0

但是他們的@RequestMapping註釋在方法上是不同的。是的,應該是會話範圍的另一個應用範圍。 –

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{ 
... 
} 
+0

感謝您的留言。我已經使用了這個,並得到另一個異常:不能映射處理程序'adminController'URL路徑[/ /時區/ {分鐘}]:已經映射了處理程序'scopedTarget.adminController'。它會是什麼? –

+0

你能分享你的應用程序cotext xml文件嗎? –

+0

這裏只是噸的配置xmls我不知道分享什麼( –

相關問題