gpt4 book ai didi

具有托管属性的 JSF 注入(inject),好的模式?

转载 作者:行者123 更新时间:2023-12-02 22:30:38 24 4
gpt4 key购买 nike

我对 JSF 很陌生,并没有真正“习惯”不同的想法,所以我在(我认为)基本的东西上苦苦挣扎。

假设我有一个 User 类,它是一个 session bean。

假设我有一个包含 10000 个对象的 Controller ,比如 Factory,它需要能够将其中一些对象设置为“锁定”,在我们的例子中,这意味着“锁定”字段不再变为空,而是引用一个“LockedItem”对象。

这是我无法正常工作的地方:LockedItem,当您实例化它时,应该引用当前登录的用户。我应该怎么做?

我尝试使用@managedproperty 进行注入(inject),但它在 LockedItem.constructor 中为 null(我认为这是正常的)然后我尝试使用 @PostConstruct 方法,但从未调用该方法(为什么?即使我将其设为 managedbean ...只有在“.xhtml”创建对象时才调用后构造方法吗?)或者我应该使用“java se”技巧,比如让用户静态化?


阐明为什么不调用 @PostConstruct 的代码(“Seat”之一):

.xhtml

<h:outputLabel id="user" value="Hello #{user.name}" />
<h:outputLabel id="car" value="you have #{car.brand}" />

用户

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class User implements Serializable {
private String name ;

public User()
{
name = "toto";
System.out.println("User constructor");
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}


}

汽车

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Car implements Serializable {
private String brand ;
private Seat seat ;

public Car()
{
brand = "audi" ;
seat = new Seat();
System.out.println("Car constructor") ;
}

public String getBrand() {
return brand;
}

public void setBrand(String brand) {
this.brand = brand;
}


}

座位

package test;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean
public class Seat implements Serializable {
private int nb ;
private String userName ;

@ManagedProperty("#{user}")
private User user ;

public Seat()
{
nb = 4 ;
userName="na";
System.out.println("! Seat constructor ") ;
}

@PostConstruct
public void init()
{
System.out.println("!! Seat postconstruct : "+user.getName());
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public int getNb() {
return nb;
}

public void setNb(int nb) {
this.nb = nb;
}
}

谢谢!

最佳答案

@PostConstruct 是正确的方法。

如果您使用 new 运算符(显然)自己实例化 bean,则不会调用它。仅当 JSF 像 #{bean} 这样在 EL 上下文中首次引用 bean 时才实例化和管理 bean 本身时才会调用它。这确实通常发生在 View 端,但这也可能发生在模型/ Controller 端 @ManagedProperty("#{bean}")Application#evaluateExpressionGet() .

你绝对不应该让 User 静态化。它将在应用程序范围内共享,而不是在 session 范围内共享。

另一种方法是将当前 User 作为 LockedItem 的构造函数参数传递,或者调用初始化方法 yourself,确定是否该类根本不代表合法的 JSF 支持 bean。

关于具有托管属性的 JSF 注入(inject),好的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320563/

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