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());
}
}
您是否在转换器的方法中放置了断点?或者,这只是你对“缺少System.out.println(”作为对象“)的天真观察;'?你真的排除了'Integer#parseInt()'抛出一个异常的可能性吗? – BalusC 2013-05-09 14:52:37
是的,我做到了。它根本没有经过方法。但我通过在selectOneMenu组件中放入'required ='true''来解决它。我认为转换器在验证后工作。所以需要意味着有验证,然后转换器完成它的工作。 – Odgiiv 2013-05-10 01:45:03
嗯,这是意想不到的。您正在使用哪种JSF impl /版本? 'web.xml'中有哪些'javax.faces。*'上下文参数?顺便说一下,转换器在验证器之前运行。 – BalusC 2013-05-10 11:37:27