【问题标题】:Primefaces selectOneMenu blocks method call in BeanPrimefaces selectOneMenu 阻止 Bean 中的方法调用
【发布时间】:2017-02-03 07:57:17
【问题描述】:

当我在页面中使用以下下拉列表时遇到问题。详细地说,当我使用 selectOneMenu 并按下下面列出的按钮时,永远不会调用 save 方法。它只是通过我用 f:event 定义的所有方法。一旦我从我的页面中删除 selectOneMenu 并再次按下保存按钮,我的方法就会被调用而没有任何问题。

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

下拉列表数据通过以下方法加载(注意,unitList已初始化)

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

我的 bean 有以下注解 @ManagedBean @ViewScoped

这是我的按钮:

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

更多信息,我注意到当我按下保存按钮时,selectedUnitDTO 的设置器永远不会被调用。

Primefaces 版本:6.0

【问题讨论】:

  • 您的UnitDTOConverter 吗?似乎验证和/或转换失败,所以你的 setter 永远不会被调用。
  • 不,我不使用转换器。从 unitList 中检索到的对象类型与我要设置的 selectedUnitDTO 相同。
  • 在您的页面中添加h:messages,您很可能会看到一个错误(很可能也在日志中)。在这种情况下,您需要转换器。 itemValue 在回发到服务器时是一个字符串,而不是一个对象。尝试使用普通的 jsf selectOneMenu,同样的问题!

标签: jsf primefaces


【解决方案1】:

当您使用对象时,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>

【讨论】:

  • 是的。这就是问题所在。我需要一个转换器。我做了一些不同的事情来满足我的需要。而不是使用 (List) context.getApplication().evaluateExpressionGet(context, "#{myController.unitList}", List.class);并迭代,我创建一个新的 UnitDTO 设置 id 并返回新创建的 UnitDTO。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多