Pick Custom Object from Select one menu JSF [dupli

2019-03-02 01:54发布

This question already has an answer here:

I want to pick a custom object from select one menu. It neither shows an error nor values. What should I do?

My xhtml document:

<h:panelGrid columns="2">
    <p:outputLabel value="" />
        <p:selectOneMenu id="CurrencyMenu" value="#{CurrencyMB.currency}" >
            <f:selectItem itemLabel="-- Select Currency--" itemValue="#{null}"/>
        <f:selectItems value="#{CurrencyMB.currencyList}" var="currency"  itemValue="#{currency.currencyId}" itemLabel="#{currency.currencyName}" > 
            </f:selectItems>
        <p:ajax update="currencyOut" />
        </p:selectOneMenu>
        <p:outputLabel value="Currency Id : #{CurrencyMB.currency.currencyId}" id="currencyOut" />
</h:panelGrid>

My managedBean class:

@ManagedBean(name = "CurrencyMB")
@RequestScoped
public class CurrencyManagedBean {

private Currency currency;
private List<Currency> currencyList;


public Currency getCurrency() {
        return currency;
    }

public void setCurrency(Currency currency) {
        this.currency = currency;
    }
public List<Currency> getCurrencyList() {
        currencyList = new ArrayList<Currency>();
        currencyList.addAll(getiCurrencyService().getCurrencies());
        return currencyList;
    }

public void setCurrencyList(List<Currency> currencyList) {
        this.currencyList = currencyList;
    }

}

2条回答
男人必须洒脱
2楼-- · 2019-03-02 02:18

You are trying to map a Java object of class Currency to a string that comes as a HTTP request parameter. A converter is intended to be used in a situation when you need to create an object from a its string representation, and vice versa, like in the situation you faced.

Basically there are two approaches.

1. Utilize converter.

With this approach you define item value as a Currency object and use a converter to create string representation from an object and recreate an object back from a string. For the converter part, just follow the tutorial Luiggi pointed at. Basically you need to create a class that implements Converter, annotate it with @FacesConverter("currencyConverter") to be able to refer to the converter by id, like in converter="currencyConverter" attribute of a JSF tag:

<p:selectOneMenu id="CurrencyMenu" value="#{CurrencyMB.currency}" converter="currencyConverter">
    <f:selectItems value="#{CurrencyMB.currencyList}" var="currency"  itemValue="#{currency}" itemLabel="#{currency.currencyName}" /> 
    <p:ajax update="currencyOut" />
</p:selectOneMenu>

2. Utilize plain Strings (or java primitive wrappers).

With this approach you bind item values, as well as user selection to a bean property of String type, and not to an actual object. Using it this way you won't need any converter, and string values will be set for you:

<p:selectOneMenu id="CurrencyMenu" value="#{CurrencyMB.currencyName}">
    <f:selectItems value="#{CurrencyMB.currencyList}" var="currency"  itemValue="#{currency.currencyName}" itemLabel="#{currency.currencyName}" /> 
    <p:ajax update="currencyOut" />
</p:selectOneMenu>

Finally, it is worth reading the question to the answer Why selectOneMenu Send ItemLabel to the converter?.

查看更多
家丑人穷心不美
3楼-- · 2019-03-02 02:37

You can create Converter for your Custom Object Currency.

Step 1: Create a Converter class and Implement javax.faces.convert.Converter Interface,Override getAsObject and getAsString methods and write your logic for String to Object Conversion and Object to String Conversion.

Step 2: Simply declare something like @FacesConverter("currencyConverter") in your converter class or If you want use Spring Inject or Autowired Annotation in Converter class declare your Converter Class with @Component("currencyConverter") Annotation and don't use @FacesConverter.And your converter class should in component scan package.

Step 3: Declare your converter in Selectonemenu Using converter property.

If you still have any problem please refer this link

http://www.techpages.org/jsf/jsf-custom-object-converter-from-selectonemenu/2428/

查看更多
登录 后发表回答