【问题标题】:ENTITY object in the JSF SelectOneMenu is not workingJSF SelectOneMenu 中的 ENTITY 对象不起作用
【发布时间】:2012-06-13 16:28:20
【问题描述】:

我想从 SelectOneMenu 中获取实体的实例,以便将实体变量分配给其他方法。但它指向null。

xhtml代码

<h:selectOneMenu value="#{statusReport.projectDetID}" converter="ObjectStringConv" onchange="#{statusReport.retrieveReport()}" >
                <f:selectItems value="#{statusReport.listOfProjectDetail}"
                    var="projectDetail" itemLabel="#{projectDetail.project}              #{projectDetail.startDate}   -    #{projectDetail.endDate}"
                    itemValue="#{projectDetail}" noSelectionValue="Select the Saved Project"/>
            </h:selectOneMenu>

状态报告豆

public class StatusReport implements Serializable {


    private ProjectDetail projectDetID;

    private List<ProjectDetail> listOfProjectDetail;

    public List<ProjectDetail> getListOfProjectDetail() {
        listOfProjectDetail = projectDetailFacade.findAll();
        return listOfProjectDetail;
    }

    public void setListOfProjectDetail(List<ProjectDetail> listOfProjectDetail) {
        this.listOfProjectDetail = listOfProjectDetail;
    }
    public ProjectDetail getProjectDetID() {
        return projectDetID;
    }

    public void setProjectDetID(ProjectDetail projectDetID) {
        this.projectDetID = projectDetID;
    }


    public void retrieveReport(){

        System.out.println(" Processing .....");
        if ( projectDetID == null )
        {
            System.out.println("The object from Select null");
        }
        else
        {
        System.out.println("The object from Select menu" + projectDetID.toString());
        }

        System.out.println("Generated Data:Completed");

}}

ProjectDetail 实体 Bean

package com.jira.entity;

import java.io.Serializable;
import javax.persistence.*;

import java.util.Date;
import java.util.List;


/**
 * The persistent class for the PROJECT_DETAIL database table.
 * 
 */
@Entity
@Table(name="PROJECT_DETAIL",schema="weeklyrep")

public class ProjectDetail implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="projectdetail_seq")
    @SequenceGenerator(name="projectdetail_seq",schema="weeklyrep",sequenceName="projectdetail_seq", allocationSize=1)
    @Column(name="PDETAIL_ID")
    private long pdetailId;

    private Boolean completed;

    @Temporal( TemporalType.DATE)
    @Column(name="END_DATE")
    private Date endDate;

    private Long project;

    @Temporal( TemporalType.DATE)
    @Column(name="START_DATE")
    private Date startDate;

    //bi-directional many-to-one association to MajorEvent
    @OneToMany(mappedBy="projectDetail",cascade=CascadeType.ALL)
    private List<MajorEvent> majorEvents;
    //bi-directional one-to-one association to ExecSummary
    @OneToOne(mappedBy="projectDetailExec",cascade=CascadeType.ALL)
    private ExecSummary execSummary;
    public ProjectDetail() {
    }

    public long getPdetailId() {
        return this.pdetailId;
    }

    public void setPdetailId(Long pdetailId) {
        this.pdetailId = pdetailId;
    }

    public Boolean getCompleted() {
        return this.completed;
    }

    public void setCompleted(Boolean completed) {
        this.completed = completed;
    }

    public Date getEndDate() {
        return this.endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public long getProject() {
        return this.project;
    }

    public void setProject(long project) {
        this.project = project;
    }

    public Date getStartDate() {
        return this.startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public List<MajorEvent> getMajorEvents() {
        return this.majorEvents;
    }

    public void setMajorEvents(List<MajorEvent> majorEvents) {
        this.majorEvents = majorEvents;
    }

    public ExecSummary getExecSummary() {
        return execSummary;
    }

    public void setExecSummary(ExecSummary execSummary) {
        this.execSummary = execSummary;
    }


}

转换器

我不知道它是否需要转换器,但我不知道如何编码。

package com.weeklyreport.converters;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import com.jira.entity.ProjectDetail;


@FacesConverter(value="ObjectStringConv")
public class ObjectStringConv implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String svalue) {
        System.out.print("String version of object is:" + svalue);
        return "test";
    }

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

            return ovalue.toString();
        }

    }

请帮我解决这个问题。有没有办法像这样获取实体对象的实例?

【问题讨论】:

    标签: jsf-2 facelets icefaces-2


    【解决方案1】:

    您的转换器需要以这种方式编写,以便它可以根据ProjectDetail 的唯一标识符在ProjectDetail 和String 之间进行转换。通常实体有一个id。您需要将其用作String 值。这是一个没有任何琐碎检查(如 null 和 instanceof)的启动示例:

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        // Convert ProjectDetail to its unique String representation.
        ProjectDetail projectDetail = (ProjectDetail) value;
        String idAsString = String.valueOf(projectDetail.getId())
        return idAsString;
    }
    
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        // Convert unique String representation of ProjectDetail back to ProjectDetail object.
        Long id = Long.valueOf(value);
        ProjectDetail projectDetail = someProjectDetailService.find(id);
        return projectDetail;
    }
    

    请注意,在 JSF 转换器(和验证器)中使用 EJB 需要一些技巧。另见How to inject @EJB, @PersistenceContext, @Inject, @Autowired, etc in @FacesConverter?

    【讨论】:

    • public Object getAsObject(FacesContext context, UIComponent component, String svalue) { // 将 ProjectDetail 的唯一 String 表示转换回 ProjectDetail 对象。 Long id = Long.valueOf(svalue); ProjectDetailFacade projectDetailFacade = null;尝试 { projectDetailFacade = (ProjectDetailFacade) new InitialContext().lookup("java:com.jira.sessionbean.ProjectDetailFacade"); } catch (NamingException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } ProjectDetail projectDetail = projectDetailFacade.find(id);返回项目详情; }
    • 这是每个实体的每个关键字段的大量代码。真的没有更好的办法吗?!拥有数百个实体的系统中的代码/维护令人恐惧……
    • @Darrell:要么让所有实体从基类扩展,要么使用 OmniFaces:stackoverflow.com/questions/17343032/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-18
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多