我想實現一些功能來獲取當前登錄的用戶(表示當前登錄人員的JPA實體)。但是,而不是在傳統的方式Spring Scope代理模式AspectJ?
CurrentUserService.getCurrentUser(){load the user from db by login})
做我想要做一個更CDI方式。
我想要一個CurrentUserFactory
,它提供當前用戶作爲可用自定義限定符(當前bean)的請求作用域bean。
預選賽:
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface CurrentUser {
}
廠:
@Component
public class CurrentUserFactory {
@CurrentUser
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST,
proxyMode = ScopedProxyMode.TARGET_CLASS)
public User currentUser() throws IllegalStateException {
return
<DoWhatIMean>
User load form DB by:
SecurityContextHolder.getContext().getAuthentication().getName()
</dwim>
}
用法:
@Controller
@RequestMapping(…)
public AccountController() {
@Resource
@CurrentUser
private User currentUser;
@RequestMapping(params=」my」)
public String myAccount() {
return 「redirect:/account/」+currentUser.id;
}
}
這工作正常。
但是,如果我將當前用戶用於直接JPA(Hibernate)類似的東西(如通過引用currentUser搜索實體或存儲實體以引用currentUser),它就會失敗(並非真正有用的異常)。 - (這個失敗是明確)
的原因是,春天注入的currentUser的CGI代理。只要僅使用此代理的屬性,此工作正常,但如果開始使用引用本身,則失敗。
我知道我在規範的邊緣工作,我接受如果我的想法不起作用。但我想問你,我有一個想法讓它工作。這樣開發人員就可以像使用普通的JPA加載實體一樣使用這個currentUser對象。
我要的至少是這很容易只是當前用戶的使用情況:
@Resouce
@CurrenctUser
User currentUser;
,就是這樣。
可能有人有一個想法讓它工作,例如一個AspectJ技巧(我正在使用編譯時AspectJ)?
反正:就像我之前說的例外是不是我的問題,我理解他們,因爲他們所描述的問題的唯一指標。
例外,當我試圖通過currentUser(Select b From Bookmark b Where user=?
)
java.lang.IllegalStateException
加載:org.hibernate.TransientObjectException
:對象引用一個未保存的瞬態的實例 - 沖洗之前保存的瞬態的實例:domain.User
例外,當我嘗試保存書籤(書籤有現場用戶)
可能不插入:[
domain.Bookmark
]; SQL [insert into bookmark (businessId, reference_Folder_fk, title, user_fk) values (?, ?, ?, ?)
];約束[null
];嵌套的例外是org.hibernate.exception.ConstraintViolationException
:無法插入:[domain.Bookmark
]
這將有助於瞭解什麼是例外情況。 –
@matt b:我添加了例外。 – Ralph
是用戶對象在獲取它和'select b from bookmark b where user =?'query?之間被修改的任何地方? –