【问题标题】:Why SelectOneMenu ignores the converter?为什么 SelectOneMenu 会忽略转换器?
【发布时间】:2011-06-26 20:11:20
【问题描述】:

我有一个对象列表 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 属性中的文本放入

【问题讨论】:

    标签: java jsf jakarta-ee facelets


    【解决方案1】:

    转换器仅用于转换下拉列表的(无论您看到&lt;option value&gt;不是转换标签下拉菜单(无论您在 &lt;option&gt;&lt;/option&gt; 之间看到什么。标签是在下拉菜单中可见的标签。

    如果您想将 label 更改为与 value 相同,那么您只需要这样做:

    <f:selectItems value="#{priorityController.priorityList}" var="priority"
        itemValue="#{priority}" itemLabel="#{priority.order} - #{priority.name}" />
    

    对于#{priority} 的项目值,仍将调用转换器。虽然我更喜欢使用一些自动生成的数据库 ID 而不是一种标签值,这样转换效率更高。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多