1 回答

TA貢獻1784條經驗 獲得超9個贊
根據(jù)您的評論,您必須使用@SessionScope
. 如果您希望所有用戶都擁有一個實例,則可以使用@Singleton
and 。@ApplicationScope
解決您的問題:
你想
Client
在用戶登錄時實例化。所以當你在登錄服務中時,這個對象還沒有實例化,所以你不能把@Inject
它放到你的登錄服務中,你應該記得刪除注釋@Inject
。您需要使用
@Produces
注釋。當你想控制你的類被實例化的方式時,使用這個注解。當 CDI 容器要查找該類的實現(xiàn)時Client
,如果它找到一個返回Client
并具有@Produces
注釋的方法,它會調用該方法,而不是僅僅實例化自身Client
。你應該做你的登錄業(yè)務,然后創(chuàng)建一個實例Client
并將其作為成員變量存儲在你的登錄服務中。然后在此類中添加一個返回該客戶端對象的方法,并用 注釋該方法@Produces
。您的登錄服務的最終結構如下所示:
@SessionScope
public class LoginService {
private Client client;
public void login(String username, String password) {
// implement login business
// if login is successful
client = clientEntity;
}
@Produces
@SessionScope
public Client clientProducer() {
return this.client;
}
}
您還可以將@Produces注釋放在字段之上。在這種情況下,CDI 容器將使用存儲在該字段上的值而不是調用方法。
@SessionScope
public class LoginService {
@Produces
@SessionScope
private Client client;
public void login(String username, String password) {
// implement login business
// if login is successful
client = clientEntity;
}
}
當然,這應該被視為一種偽代碼。我不知道你們公司的所有細節(jié)。也許您實現(xiàn)邏輯的方式是完全錯誤的;)。但要解決這個具體問題,@Produces應該可行。
添加回答
舉報