繁体   English   中英

Primefaces selectOneListbox值为null

[英]Primefaces selectOneListbox value is null

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

所以我想使用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值始终设置为null吗?

非常感谢!

其实我已经找到问题了。

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

我必须使用值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();
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM