gpt4 book ai didi

jsf - 如何使用 CDI 将 http session 属性注入(inject)到 bean

转载 作者:行者123 更新时间:2023-12-04 17:47:32 24 4
gpt4 key购买 nike

我有一些遗留代码使用如下代码将对象作为 http session 属性:

MyObject object = new MyObject();
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
sessionMap.put("attrname", object);

旧的 facelets 使用
 @ManagedProperty("#{attrname}")
private MyObject object;

有没有办法使用 CDI ( @Inject ) 将此 session 属性注入(inject) Bean?

在使用 CDI 的新代码中,创建和注入(inject)需要以受控方式创建的对象的更好方法是什么。

最佳答案

使用 @Produces 在 session 范围的托管 bean 中获取它@Named在 setter/getter 上。

@SessionScoped
public class MyObjectProducer implements Serializable {

private MyObject myObject;

@Produces
@Named("attrname")
public MyObject getMyObject() {
return myObject;
}

public void setMyObject(MyObject myObject) {
this.myObject = myObject;
}

}

当您通过例如以某种方式设置它时 myObjectProducer.setMyObject(myObject)其他地方(或者可能是 CDI @Observes 事件),那么您可以使用 @Inject @Named 将其注入(inject)到任何地方.
@Inject
@Named("attrname")
private MyObject myObject;

是的,它仍然可以通过 #{attrname} 获得以通常的方式在 EL 中。不,它不会在未设置时自动创建,它将保持 null直到您实际将其设置为生产者类的属性。

或者,如果您真的打算保留通过 ExternalContext#getSessionMap() 设置实例的传统方式(例如,因为它是第三方,因此您不能更改它),那么您也可以让生产者直接从 session 映射中返回它:
@SessionScoped
public class MyObjectProducer implements Serializable {

@Produces
@Named("attrname")
public MyObject getMyObject() {
return (MyObject) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("attrname");
}

}

但是,当注入(inject)到非 JSF 工件(例如任意 @WebServlet)中时,这并不能保证有效。 ,如 FacesContext#getCurrentInstance()显然会返回 null .

关于jsf - 如何使用 CDI 将 http session 属性注入(inject)到 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28855122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com