2013-05-08 23 views
1

我有一个<h:selectOneMenu>未调用转换器getAsObject方法

<h:selectOneMenu id="LoanType" style="width: 180px; font-size: 12px;" value ="#{editLoan.currentLoanType}" converter="#{convertToLoanType}"> 
    <f:selectItems value="#{editLoan.loanTypeList}" var="parLoanType" itemValue="#{parLoanType}" itemLabel="#{parLoanType.loanTypename}"/> 
    <f:ajax listener="#{editLoan.loanTypeChanged}" execute="@this"/> 
</h:selectOneMenu> 

如果用户改变选择,那么我想要调用一个监听器方法。但是,我的转换器的getAsObject()方法未被调用。只有getAsString()方法是,所以我在侦听器方法中获得null变量。

这里是我的转换器类:

@ManagedBean 
@RequestScoped 
public class ConvertToLoanType implements Converter { 

    @PersistenceContext(unitName = "CrasmonClientPU") 
    private EntityManager em; 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     try{ 
      int id = Integer.parseInt(value); 
      System.out.println("getting as object"); 
      return em.find(ParLoantype.class, id); 

     }catch(Exception e){ 
      System.out.println(e.getMessage()); 
     } 
     return null; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     try{ 
      ParLoantype pa = (ParLoantype) value; 
      return String.valueOf(pa.getLoanTypeid()); 

     }catch(Exception e){ 
      System.out.println(e.getMessage()); 
     } 
     return null; 
    } 
} 

这里是我的后盾豆豆类:

@Named(value = "editLoan") 
@SessionScoped 
public class EditLoan implements Serializable { 

    @Inject 
    private LoanmainController lmainController; 

    ParLoantype currentLoanType; 
    LoanMain loanMain; 
    List<LoanMain> allLoans; 
    List<ParLoantype> loanTypeList; 

    public EditLoan() { 
    } 

    @PostConstruct 
    public void init(){ 
     currentLoanType = lmainController.findLoantype(1); 
     this.allLoans = findLoansByParLoantype(currentLoanType); 
     this.loanTypeList = lmainController.prepareAllParLoantype(); 
    } 

    public void loanTypeChanged(){ 
     System.out.println(this.currentLoanType.getLoanTypename()); 
     //this.allLoans = findLoansByParLoantype(currentLoanType); 
    } 

    public List<LoanMain> findLoansByParLoantype(ParLoantype type){ 
     return lmainController.findLoansByParLoanType(type.getLoanTypeid()); 
    } 
} 
+0

您是否在转换器的方法中放置了断点?或者,这只是你对“缺少System.out.println(”作为对象“)的天真观察;'?你真的排除了'Integer#parseInt()'抛出一个异常的可能性吗? – BalusC 2013-05-09 14:52:37

+0

是的,我做到了。它根本没有经过方法。但我通过在selectOneMenu组件中放入'required ='true''来解决它。我认为转换器在验证后工作。所以需要意味着有验证,然后转换器完成它的工作。 – Odgiiv 2013-05-10 01:45:03

+0

嗯,这是意想不到的。您正在使用哪种JSF impl /版本? 'web.xml'中有哪些'javax.faces。*'上下文参数?顺便说一下,转换器在验证器之前运行。 – BalusC 2013-05-10 11:37:27

回答

1

你保证把<p:selectOneMenu>一个<h:form>里面?当转换器未被调用时,这是我的错误。

+0

是的,我有同样的问题,这是问题谢谢:) – ismail 2015-12-02 11:40:09