1 回答
TA贡献1784条经验 获得超9个赞
根据您的评论,您必须使用@SessionScope
. 如果您希望所有用户都拥有一个实例,则可以使用@Singleton
and 。@ApplicationScope
解决您的问题:
你想
Client
在用户登录时实例化。所以当你在登录服务中时,这个对象还没有实例化,所以你不能把@Inject
它放到你的登录服务中,你应该记得删除注释@Inject
。您需要使用
@Produces
注释。当你想控制你的类被实例化的方式时,使用这个注解。当 CDI 容器要查找该类的实现时Client
,如果它找到一个返回Client
并具有@Produces
注释的方法,它会调用该方法,而不是仅仅实例化自身Client
。你应该做你的登录业务,然后创建一个实例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;
}
}
当然,这应该被视为一种伪代码。我不知道你们公司的所有细节。也许您实现逻辑的方式是完全错误的;)。但要解决这个具体问题,@Produces应该可行。
添加回答
举报