2017-02-03 2 views
0

У меня проблема, когда я использую следующий раскрывающийся список на моей странице. В деталях, когда я использую selectOneMenu и нажмите на кнопку, указанную ниже метода save никогда не вызывается. Он просто просматривает все методы, которые я определил только с событием f:. Как только я удалю selectOneMenu с моей страницы и снова нажмите кнопку сохранения, мой метод вызывается без каких-либо проблем.Поверхности selectOneMenu блокирует вызов метода в Bean

<p:selectOneMenu id="unitList" 
    value="#{myController.userDTO.selectedUnitDTO}"> 
    <f:selectItems value="#{myController.unitList}" var="unitList" 
     itemValue="#{unitList}" itemLabel="#{unitList.name}" /> 
</p:selectOneMenu> 

Выпадающий список загрузки данных с помощью следующего метода (Примечание. UnitList является initialiazed)

public List<UnitDTO> getUnitList() { 
    return unitList; 
} 

Мой боб имеет следующие аннотации @ManagedBean @ViewScoped

и это моя кнопка:

<p:commandButton id="save" action="#{myController.save}" value="SAVE" /> 

Дополнительная информация, я заметил, что когда я нажимаю кнопку сохранения, сеттер selectedUnitDTO никогда не вызывается.

Primefaces Версия: 6,0

+1

У вас есть 'Конвертер' для вашего' UnitDTO'? Похоже, валидация и/или преобразование терпят неудачу, поэтому ваш сеттер никогда не вызывается. – Tomek

+0

Нет, я не использую конвертер. Тип объекта, который извлекается из unitList, совпадает с типом selectedUnitDTO, который я хочу установить. – Stephan

+0

Поместите на страницу 'h: messages', и вы, скорее всего, увидите ошибку (скорее всего, в журнале тоже). В этом случае вам нужен ** конвертер. ItemValue - это строка, когда она отправляется обратно на сервер, а не объект. Попробуйте использовать простой jsf selectOneMenu, ту же проблему! – Kukeltje

ответ

2

JSF требуют преобразователей при использовании объектов, в данном случае, для p:selectonemenu

Вы можете добавить следующий класс Java:

import java.util.List; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.FacesConverter; 

@FacesConverter("converterUnitDTO") 
public class ConverterUnitDTO implements Converter { 

    @Override 
    public UnitDTO getAsObject(FacesContext context, UIComponent component, String value) { 
     List<UnitDTO> unitsDTO = (List<UnitDTO>) context.getApplication().evaluateExpressionGet(context, "#{myController.unitList}", List.class); 
     for (UnitDTO unitDTO : unitsDTO) 
      if (unitDTO.toString().equals(value)) 
       return unitDTO; 
     return null; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     try { 
      return value.toString(); 
     } catch (Exception e) { 
      return ""; 
     } 
    } 

} 

В вашем XHTML изменить на это:

<p:selectOneMenu id="unitList" 
    value="#{myController.userDTO.selectedUnitDTO}" converter="converterUnitDTO"> 
    <f:selectItems value="#{myController.unitList}" var="unitList" 
     itemValue="#{unitList}" itemLabel="#{unitList.name}" /> 
</p:selectOneMenu> 
+0

Да. Это была проблема. Мне нужен конвертер. Я делал это как-то иначе, чтобы соответствовать моим потребностям. Вместо retrieve с (List ) context.getApplication() .ExpressionGet (контекст, "# {myController.unitList}", List.class); и итерации, я создаю новый UnitDTO, устанавливающий id и возвращаю вновь созданный UnitDTO. Спасибо. – Stephan

Смежные вопросы