不保存到会话 bean 的值

value not saving to session bean

我创建了一个会话 bean,但我的 <h:selectOneMenu> 似乎没有将值存储在该 bean 中。有人可以告诉我我做错了什么吗?

在 xhtml 中导航到显示结果的另一个 xhtml。除了导航规则,我在 faces-config.xml 中没有任何值,因为我认为托管 bean / 会话 bean 注释可以替换它

xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
       <!-- Using a custom header -->
       <ui:include src="/resources/ADTHeader.xhtml" />
    <h:body>
        <h1>Test</h1>
        <h:form>
        <h:selectOneMenu id="mypick"
            value="#{gridMaster_backing.pickedGrid}" 
            converter="#{categoryConverter}"
            title="ADTF" >
            <f:selectItems value="#{gridMaster_backing.gridList}" var="prog" itemValue="#{prog.gridid}" itemLabel="#{prog.gridid} - #{prog.program} - #{prog.project} - #{prog.ci}" />
        </h:selectOneMenu>
        <br /><br />
        <h:button  value="View Grid" outcome="result" /> 
        </h:form>
    </h:body>
</html>

会话 bean:

package edu.adtf.web;

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

import com.ray.adtf.ejb.*;
import com.ray.adtf.jpa.Gridmaster;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@ManagedBean
@SessionScoped
public class gridMaster_backing {

    @EJB
    private GridMasterBean ejb;
    private Collection<Gridmaster> mgrid;

    private List gridList = new ArrayList();

    // pickedGrid holds value picked from the gridid drop down list
    private Long pickedGrid; 

    public Long getPickedGrid() {
        //System.out.println("getPicked Grid");
        return pickedGrid;
        //return (long) 100;
    }

    public void setPickedGrid(Long pickedGrid) {
        this.pickedGrid = pickedGrid;
    }

    // returns data to show grid form
    public Collection<Gridmaster> getGridmaster(Long vgridid){
        mgrid = ejb.getAllGrids(vgridid);
        return mgrid;
    }

    public void setGridList(List gridList) {
        this.gridList = gridList;
    }

    // list for grid list drop down
    public List getGridList() {
        List gridList2 = ejb.getDisplayGridList();
        return gridList2; 
        }
    }

转换器:

package edu.adtf.web;
import javax.faces.bean.ManagedBean;
import edu.adtf.jpa.Gridmaster;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@ManagedBean(name = "categoryConverterBean") 
@FacesConverter(value = "categoryConverter")
public class CategoryConverter implements Converter{
    @PersistenceContext
    private transient EntityManager em;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        //System.out.println(em.find(Gridmaster.class, new Long(value)));
        return em.find(Gridmaster.class, new Long(value));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {

        Gridmaster gridmaster;
        gridmaster = (Gridmaster) value;
        //System.out.println(String.valueOf(gridmaster.getGridid()));
        return String.valueOf(gridmaster.getGridid());

    }
}

问题出在您使用的转换器上。您所在的托管 bean 的字段 getting/setting 数据类型为 Long<h:selectOneMenu> 的默认值类型为 String,因此您只需要使用 Long 转换器。这种情况下有一个内置转换器:javax.faces.Long。确保您为 <h:selectItems> 定义的 itemValue 也是类型 Long

代码应如下所示:

<h:selectOneMenu id="mypick"
    value="#{gridMaster_backing.pickedGrid}" 
    converter="javax.faces.Long"
    title="ADTF">
    <!-- #{prog.gridid} must return Long -->
    <f:selectItems
        value="#{gridMaster_backing.gridList}"
        var="prog"
        itemValue="#{prog.gridid}"
        itemLabel="#{prog.gridid} - #{prog.program} - #{prog.project} - #{prog.ci}" />
</h:selectOneMenu>