2011-02-04 106 views
5

在我的自定義身份驗證提供程序中,我能夠通過我的Service API獲取域對象,但是當我從一個域對象抓取到另一個域對象以獲取確定的值以執行其他檢查時,Spring笙歌Hibernate的Session不存在: -使用事務包裝Spring Security自定義身份驗證提供程序

domain.getAnotherDomain().getProperty(); // epic FAIL 

我有以下AOP的事務來包裝與交易所有我的項目的API,而且我敢肯定我的自定義身份驗證提供者分爲以下模式: -

<tx:advice id="txAdvice"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 

<aop:config> 
    <aop:advisor pointcut="execution(* my.project..*.*(..))" advice-ref="txAdvice" /> 
</aop:config> 

我也有配置OpenSessionInView過濾器,但我不認爲適用於春季安全反正。

我想我可以創建一個特定的服務API來執行所有必需的檢查,但我很好奇爲什麼我無法用適當的事務包裝我的自定義身份驗證提供程序。

任何解釋?謝謝。

回答

2

我的解決方法解決方案是創建一個服務API來進行檢查,以避免在我的自定義身份驗證提供懶加載錯誤。

1

春抱怨Hibernate的Session不存在

不太清楚我關注你的所有問題,但我覺得上面的語句表示您的主要問題,對不對?您沒有提供任何堆棧跟蹤,但我想這是你剛纔所描述的臭名昭著的「沒有會議或會議閉幕」,屬於典型的場景:

domain.getAnotherDomain()的getProperty(); //史詩失敗

也許我失去了一些東西,但我認爲典型的答案會在這裏也適用:與fetch=FetchType.EAGER映射的關係,這樣你就不必延遲加載它,當會話已經關閉。

+0

異常消息是'無法懶惰地初始化一個角色集合:ss.domain,沒有會話或會話被關閉。除非絕對必要,否則我寧願不執行預先提取...也就是說,如果我得到事務來包裝自定義身份驗證提供程序類。 – limc 2011-02-04 17:03:18

0

我遇到了同樣的問題,原因是我在web.xml文件中的OpenSessionInView過濾器之前聲明瞭Spring Security的過濾器。一旦我換了它們,問題就消失了。

原因是因爲Spring Security在被OpenSessionInView過濾器打開Hibernate會話之前被調用,所以沒有打開會話。

0

您還沒有發佈,將讓我們做任何有意義的建議的任何代碼。

但是,自定義身份驗證提供程序的一個問題可能是您可能標記爲@Transactional一個抽象方法,您正在重寫並正在從抽象類實例中調用該方法。

例如retreiveUserAbstractUserDetailsAuthenticationProvider。此方法從實例中調用(參見方法認證),因此無法通過初始化AOP代理機構的交易。欲瞭解更多詳情,請查詢@Transactional method calling another method without @Transactional anotation?

Spring聲明式事務模型使用AOP代理。所以AOP代理負責創建交易。只有當實例中的方法從實例外調用時,AOP代理纔會處於活動狀態。

相關問題