2012-06-10 113 views
1

我想要得到的实体从selectOneMenu用于实例,所以我可以指定实体变量其他一些方法。但它指向空。实体对象无法正常工作

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> 

statusReport豆

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; 
    } 


} 

转换

我不知道它是否需要转换器,但是我不't k现在如何编码。

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(); 
     } 

    } 

请帮我弄清楚这一点。有没有办法像这样得到实体对象的实例?

回答

4

您的转换器需要这样写,以便它可以基于ProjectDetail的唯一标识符在ProjectDetailString之间进行转换。通常实体有一个id。您需要使用此值作为String值。这里有一个例子开球没有任何琐碎的检查,像空和的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?

+0

你可以发表评论,我编辑你的答案 – VeerM

+0

公共对象的getAsObject(FacesContext的情况下,的UIComponent组件,字符串S值){ \t //转换ProjectDetail的唯一的字符串表示回ProjectDetail对象。 \t Long id = Long.valueOf(svalue); \t ProjectDetailFacade projectDetailFacade = null; \t \t尝试{ \t \t \t projectDetailFacade =(ProjectDetailFacade)新的InitialContext()查找( “Java的:com.jira.sessionbean.ProjectDetailFacade”); \t \t}赶上(NamingException的发送){ \t \t \t // TODO自动生成的catch程序块 \t \t \t e.printStackTrace(); \t \t} \t ProjectDetail projectDetail = projectDetailFacade.find(ID); \t return projectDetail; \t} – VeerM

+0

是用于注入EJB – VeerM