我有一个对象列表,一个selectOneMenu
,我要在其中显示该对象列表。我不想在该菜单中显示toString()方法的结果,而是创建了一个转换器。
问题是在h:outputText元素转换器中被调用,我看到了期望值。但是,当我将该转换器附加到h:selectOneMenu时,在呈现页面时仍会调用转换器,但结果将被忽略,而改用toString()结果。我该如何解决?
一些示例代码:
转换器:
@FacesConverter(forClass=Priority.class)
public class PriorityConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
try {
InitialContext ic = new InitialContext();
PriorityEJB priorityEJB = (PriorityEJB) ic.lookup("java:global/TicketSentinel/TicketSentinel-ejb/PriorityEJB");
return priorityEJB.getPriorityByOrd(Integer.valueOf(value.charAt(0)));
} catch (NamingException ex) {
Logger.getLogger(PriorityConverter.class.getName()).log(Level.SEVERE, null, ex);
throw new ConverterException();
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Priority p = (Priority) value;
return p.getOrder() + " - " + p.getName();
}
}
页面的一部分:
<h:outputText value="Priority:" />
<h:selectOneMenu value="#{ticketController.ticket.priority}">
<f:selectItems value="#{priorityController.priorityList}" />
</h:selectOneMenu>
控制器bean:
@Named(value = "priorityController")
@RequestScoped
public class PriorityController {
@EJB
private PriorityEJB priorityEJB;
public List<Priority> getPriorityList() {
return priorityEJB.getPriorities();
}
}
更新:
我查看了页面的来源,发现了这一点:
<td><select name="j_idt18:j_idt26" size="1">
<option value="1 - Fatal">1 - - Fatal</option>
<option value="2 - Critical">2 - - Critical</option>
<option value="3 - Very Important">3 - - Very Important</option>
<option value="4 - Important">4 - - Important</option>
<option value="5 - Minor">5 - - Minor</option>
<option value="6 - Fix if time">6 - - Fix if time</option>
<option value="7 - Insignificant">7 - - Insignificant</option>
</select></td>
这样,该引擎就可以在正确的位置打印正确的值!如何使
value
属性中的文本放入块的正文中? 最佳答案
转换器仅用于转换下拉列表的值(无论您看到的是<option value>
还是什么都不会转换下拉菜单的标签(无论您在<option>
和</option>
之间看到的内容。该标签都是可见的标签)在下拉菜单中。
如果要将标签更改为与值相同,则只需执行以下操作:
<f:selectItems value="#{priorityController.priorityList}" var="priority"
itemValue="#{priority}" itemLabel="#{priority.order} - #{priority.name}" />
对于
#{priority}
的项目值,仍将调用转换器。尽管我更喜欢使用一些自动生成的数据库ID代替标签值的类型,以便转换效率更高。