Почему SelectOneMenu игнорирует конвертер? - PullRequest
1 голос
/ 27 июня 2011

У меня есть список объектов, 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>

Контроллер EJB:

@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 помещался в тело блока

?

1 Ответ

4 голосов
/ 27 июня 2011

Преобразователь используется только для преобразования значения раскрывающегося списка (все, что вы видите как <option value> и не для преобразования метки раскрывающегося списка (все, что вы видите между <option> и </option>. Ярлык - это тот, который отображается в раскрывающемся меню.

Если вы хотите изменить метку , чтобы она соответствовала значению, вам просто нужно сделать это следующим образом:

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

Для значения элемента #{priority} преобразователь по-прежнему будет вызываться. Хотя я бы предпочел использовать какой-либо автоматически сгенерированный идентификатор базы данных вместо вида метки, чтобы преобразование было более эффективным.

...