1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
根據(jù)您的評論,您必須使用@SessionScope
. 如果您希望所有用戶都擁有一個(gè)實(shí)例,則可以使用@Singleton
and 。@ApplicationScope
解決您的問題:
你想
Client
在用戶登錄時(shí)實(shí)例化。所以當(dāng)你在登錄服務(wù)中時(shí),這個(gè)對象還沒有實(shí)例化,所以你不能把@Inject
它放到你的登錄服務(wù)中,你應(yīng)該記得刪除注釋@Inject
。您需要使用
@Produces
注釋。當(dāng)你想控制你的類被實(shí)例化的方式時(shí),使用這個(gè)注解。當(dāng) CDI 容器要查找該類的實(shí)現(xiàn)時(shí)Client
,如果它找到一個(gè)返回Client
并具有@Produces
注釋的方法,它會(huì)調(diào)用該方法,而不是僅僅實(shí)例化自身Client
。你應(yīng)該做你的登錄業(yè)務(wù),然后創(chuàng)建一個(gè)實(shí)例Client
并將其作為成員變量存儲(chǔ)在你的登錄服務(wù)中。然后在此類中添加一個(gè)返回該客戶端對象的方法,并用 注釋該方法@Produces
。您的登錄服務(wù)的最終結(jié)構(gòu)如下所示:
@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 容器將使用存儲(chǔ)在該字段上的值而不是調(diào)用方法。
@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;
}
}
當(dāng)然,這應(yīng)該被視為一種偽代碼。我不知道你們公司的所有細(xì)節(jié)。也許您實(shí)現(xiàn)邏輯的方式是完全錯(cuò)誤的;)。但要解決這個(gè)具體問題,@Produces應(yīng)該可行。
添加回答
舉報(bào)