【问题标题】:Primefaces selectOneListbox value is nullPrimefaces selectOneListbox 值为空
【发布时间】:2014-06-16 14:46:09
【问题描述】:

我需要一些我无法理解的帮助:

所以我想使用 commandButton 从 selectOneListBox 中删除一个项目,但问题是当我按下此按钮时,它使用 setter 方法但值始终为 null...我将显示代码。

farm.xhtml

<h:form>
    <h:panelGrid columns="1" columnClasses="label, value"
        cellpadding="10">
        <h:panelGroup style="width: 90%">
            <p:inputText id="cropVariation" style="margin-right: 10px"
                label="#{msg['farms.form.farmBasicInformation.cropVariation']}"
                value="#{farmsController.cropVariation}" />
            <p:inputText id="cropRotation" style="margin-right: 10px"
                label="#{msg['farms.form.farmBasicInformation.cropRotation']}"
                value="#{farmsController.cropRotation}" />
            <p:watermark for="cropVariation"
                value="#{msg['farms.form.farmBasicInformation.cropVariation']}" />
            <p:watermark for="cropRotation"
                value="#{msg['farms.form.farmBasicInformation.cropRotation']}" />
            <p:commandButton value="#{msg['buttons.add']}"
                action="#{farmsController.addCrop()}" ajax="true"
                icon="ui-icon-plus"
                update="majorCropsSelect cropRotation cropVariation"
                process="cropVariation cropRotation @this" />
        </h:panelGroup>
    </h:panelGrid>
    <p:fragment autoUpdate="true">
        <h:panelGrid columns="2" columnClasses="label, value">
            <p:selectOneListbox id="majorCropsSelect"
                style="width: 450px"
                value="#{farmsController.selectedCrop}"
                converter="#{selectOneListBoxConverter}">
                <f:selectItems value="#{farmsController.majorCrops}"
                    var="majorCrop" itemLabel="#{majorCrop}"
                    itemValue="#{majorCrop}" />
                <p:column>
                    <h:outputText value="#{majorCrop}" />
                </p:column>
            </p:selectOneListbox>
            <p:commandButton value="#{msg['buttons.remove']}"
                action="#{farmsController.removeCrop()}" ajax="true"
                icon="ui-icon-minus"/>
        </h:panelGrid>
    </p:fragment>
</h:form>

FarmsController.java

@ManagedBean
@Controller
@ViewScoped
public class FarmsController extends BaseController {

    @Autowired
    private FarmsService farmsService;

    @Autowired
    private SecurityService securityService;

    public static String BEAN_PAGE = "farm.jsf";
    public static String LIST_PAGE = "farmsManagement.jsf";

    private Farm currentFarm;

    private List<MajorCrop> majorCrops = new ArrayList<MajorCrop>();
    private MajorCrop selectedCrop = null;
    private String cropVariation;
    private String cropRotation;

public void removeCrop() {
        if (selectedCrop != null) {
            majorCrops.remove(selectedCrop);
        }
    }

public MajorCrop getSelectedCrop() {
        return selectedCrop;
    }

    public void setSelectedCrop(MajorCrop selectedCrop) {
        this.selectedCrop = selectedCrop; (here the value 'selectedCrop' is always null)
    }

public List<MajorCrop> getMajorCrops() {
        return majorCrops;
    }

    public void setMajorCrops(List<MajorCrop> majorCrops) {
        this.majorCrops = majorCrops;
    }
}

SelectOneListBoxConverter.java

@Component("selectOneListBoxConverter")
@FacesConverter(forClass=FarmsController.class, value="selectOneListBoxConverter")
public class SelectOneListBoxConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {

        SelectOneListbox p = (SelectOneListbox) component;
        MajorCrop dl = (MajorCrop) p.getValue();

        return dl;
    }

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

}

你知道为什么我可以让 selectedCrop 值总是为空吗?

非常感谢!

【问题讨论】:

  • 请创建一个答案并接受它,而不是用解决方案编辑问题(您的版本可能会回滚)
  • 因为我的名声,我还不能做,我会在 8 小时内做,我不想浪费你的时间,因为我编辑了问题。谢谢!

标签: java jsf primefaces


【解决方案1】:

其实我已经找到问题了。

关键是在转换器中我不能使用 getValue() 属性,因为之前没有设置任何值,所以没有任何值。

我必须使用 value String 变量并对其进行处理以获取我想要的对象。这是代码:

    @Component("selectOneListBoxConverter")
@FacesConverter(forClass = FarmsController.class, value = "selectOneListBoxConverter")
public class SelectOneListBoxConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {

        MajorCrop dl = new MajorCrop();

        String[] values = value.split("\\(");
        String name = "";
        for (int i = 0; i < values.length - 1; i++) {
            name += values[i];
        }

        dl.setName(name.substring(0, name.length() - 1));
        dl.setRotations(values[values.length - 1].substring(0,
                values[values.length - 1].length() - 1));

        return dl;
    }

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多