Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSFbean注入-如何传递值_Jsf_Javabeans_Code Injection - Fatal编程技术网

JSFbean注入-如何传递值

JSFbean注入-如何传递值,jsf,javabeans,code-injection,Jsf,Javabeans,Code Injection,我面临着通过注入将值从一个bean传递到另一个bean的问题 程序结构:用户搜索比萨,程序生成比萨对象并将其添加到“结果”列表中。现在我想把这个列表传递给bean PizzaResult 我的ManagedBean如下所示: @ManagedBean @SessionScoped public class PizzaSearch { // variables private List<PizzaObject> results = new ArrayList<Pizz

我面临着通过注入将值从一个bean传递到另一个bean的问题

程序结构:用户搜索比萨,程序生成比萨对象并将其添加到“结果”列表中。现在我想把这个列表传递给bean PizzaResult

我的ManagedBean如下所示:

@ManagedBean
@SessionScoped
public class PizzaSearch {
   // variables
   private List<PizzaObject> results = new ArrayList<PizzaObject>();

   // methods to search for different pizzas

   // methods to fill the list of PizzaObjects

   // getter - setter
   public List<PizzaObject> getResults() {
      return results;
   }
@ManagedBean
@会议范围
公共类比萨饼搜索{
//变数
私有列表结果=新建ArrayList();
//搜索不同比萨饼的方法
//填充Pizza对象列表的方法
//吸气剂设定器
公共列表getResults(){
返回结果;
}
另一个bean的代码段:

@ManagedBean
@SessionScoped
public class PizzaResult {

   // injection
   @ManagedProperty(value="#{pizzaSearch}")
   private PizzaSearch pizzaSearch;

   // variables
   private List<PizzaObject> results;

   @PostConstruct
   public void initResults() {
      results = pizzaSearch.getResults();               // results = empty
      int size = results.size();                        // size = 0
      this._chosenSize = new int[size];                 // chosenSize = 0
      this._chosenQuantity = new int[size];             // chosenQuantity = 0
   }

   public void addToCart(int index) {
      System.out.println("Parameter: " + results.get(index).getPizza().getPizzaID());
      System.out.println("chosen size: " + getChosenSize()[index]);
      System.out.println("chosen quantity: " + getChosenQuantity()[index]);
   }

   // getter and setter
@ManagedBean
@会议范围
公营比萨饼{
//注射
@ManagedProperty(value=“#{pizzaSearch}”)
私人比萨搜索比萨搜索;
//变数
私人名单结果;
@施工后
公共结果(){
results=pizzaSearch.getResults();//results=empty
int size=results.size();//size=0
这个。_chosenSize=new int[size];//chosenSize=0
这个。_chosenQuantity=new int[size];//chosenQuantity=0
}
公共void addToCart(整数索引){
System.out.println(“参数:”+results.get(index.getPizza().getPizzaID());
System.out.println(“所选大小:+getChosenSize()[index]);
System.out.println(“所选数量:+getChosenQuantity()[index]);
}
//接二连三
我需要在PostConstruct中初始化结果,但不知何故,每个值都是0。

  • 为了清楚起见,您可以像这样指定ManagedBean的名称吗
    @ManagedBean(name=“pizzaSearch”)
    (即使默认情况下已完成)
  • 检查会话范围的导入,它应该是
    import javax.faces.bean.SessionScoped;
    而不是
    import javax.enterprise.context.SessionScoped;
    ,请参阅有关这两者之间差异的更多信息

或者您可以使用@Inject注释:

基于CDI的bean定义

javax.enterprise.context.SessionScoped //for bean scoping
javax.inject.Named //for bean declaration
javax.inject.Inject //for injection
因此,要将您的PizzaSearch managedBean注入PizzaResult,请执行以下操作:

在比萨饼搜索中

@Named
@SessionScoped
public class PizzaSearch {
// your code here
@Named
@SessionScoped
public class PizzaResult {

@Inject
PizzaSearch pizzaSearch;
//code here
对于比萨饼结果

@Named
@SessionScoped
public class PizzaSearch {
// your code here
@Named
@SessionScoped
public class PizzaResult {

@Inject
PizzaSearch pizzaSearch;
//code here


还有另一种方法,如果您使用SessionScoped,那么您可以通过使用FacesContext来获取当前的PizzaSearch实例。默认情况下,java.util.List为空。如果您创建
PizzaSearch
,它将使用新的相应空ArrayList启动。因此,输出是正确的。您介意指出您期望lis的位置吗t要填写?PizzaObject的加载应该发生在哪里?顺便说一句,您使用了两次ClassName
PizzaSearch
。通过将代码翻译并写入本主题,加倍的类名是一个错误。PizzaSearch和PizzaResult应该是正确的。但这正是我的问题。如果不在PostConstructor中?您在第一个bean中的列表填充在哪里?我敢说它只是一个空列表。那么,您如何期望值不是0,当然是0。@Omoro看看我在第一个片段中写的://填充PizzaObject列表的方法.肯定有一种方法可以填充列表,当然也会使用它..但我不知道如何将此列表传递给第二个bean。