Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

spring-form:options tag with enum

I'm having troubles displaying a dropdown list with the proper values. I'm using the <spring-form:select>, <spring-form:options> and <spring-form:option> tags, and I just can't get it to display the correct options. With the following code, I should only be listing "Option 2", "Option 7", and "Option 8".

*Note - I do NOT want to display every possible Enum value, but for some reason Spring seems to want to display them all. It appears to be completely ignoring the list that is provided to the <spring-form:options> tag.

JSP Tags

<spring-form:select path="selectOptions">
    <spring-form:option value="" label="*** Select Option ***" />
    <spring-form:options path="${availableOptions}" />
</spring-form:select>

Enum

public enum SelectOptions {

    // CHECKSTYLE_OFF: LineLength

    /**
     * Option 1.
     */
    OPTION_1(1, "Option 1"),
    /**
     * Option 2.
     */
    OPTION_2(2, "Option 2"),
    /**
     * Option 3.
     */
    OPTION_3(3, "Option 3"),
    /**
     * Option 4.
     */
    OPTION_4(4, "Option 4"),
    /**
     * Option 5.
     */
    OPTION_5(5, "Option 5"),
    /**
     * Option 6.
     */
    OPTION_6(6, "Option 6"),
    /**
     * Option 7.
     */
    OPTION_7(7, "Option 7"),
    /**
     * Option 8.
     */
    OPTION_8(8, "Option 8"),
    /**
     * Option 9.
     */
    OPTION_9(9, "Option 9"),
    /**
     * Option 10.
     */
    OPTION_10(10, "Option 10");

    private int id;
    private String description;

    /**
     * Constructor.
     *
     * @param id the id
     * @param description the description
     */
    private SelectOptions(final int id, final String description) {
        this.id = id;
        this.description = description;
    }

    /**
     * Retrieves the {@link SelectOptions} associated with the passed in id.
     *
     * @param id the id associated with the SelectOptions
     * @return the SelectOptions
     */
    public static SelectOptions getInstance(final int id) {

        for (final SelectOptions selectOptions : SelectOptions.values()) {
            if (selectOptions.id == id) {
                return selectOptions;
            }
        }

        throw new IllegalArgumentException("SelectOptions could not be determined with id [" + id + "]");
    }

    /**
     * Retrieves the {@link SelectOptions} associated with the passed in description.
     *
     * @param description the description associated with the SelectOptions
     * @return the SelectOptions
     */
    public static SelectOptions getInstance(final String description) {

        for (final SelectOptions selectOptions : SelectOptions.values()) {
            if (selectOptions.description == description) {
                return selectOptions;
            }
        }

        throw new IllegalArgumentException("SelectOptions could not be determined with description [" + description + "]");
    }

    /**
     * Simple Getter.
     *
     * @return the id
     */
    public int getId() {
        return this.id;
    }

    /**
     * Simple Setter.
     *
     * @param id the id to set
     */
    public void setId(final int id) {
        this.id = id;
    }

    /**
     * Simple Getter.
     *
     * @return the description
     */
    public String getDescription() {
        return this.description;
    }

    /**
     * Simple Setter.
     *
     * @param description the description to set
     */
    public void setDescription(final String description) {
        this.description = description;
    }
}

Controller

public class SpringController implements SpringControllerInterface {

    /**
     * /WEB-INF/jsp/myJSP.jsp.
     */
    private static final String PAGE = "/WEB-INF/jsp/myJSP.jsp";

    /**
     * {@inheritDoc}
     */
    @Override
    public ModelAndView load(final Model model) {

        final ModelAndView mav = new ModelAndView(PAGE);

        final List<SelectOptions> availableOptions = this.getAvailableOptions();

        mav.addObject("availableOptions", availableOptions);

        return mav;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ModelAndView save(final Model model) {

        final ModelAndView mav = new ModelAndView(PAGE);

        // TODO

        return mav;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Model getModel() {
        return new ModelImpl();
    }

    /**
     * @return a list of available options
     */
    public List<SelectOptions> getAvailableOptions() {

        final List<SelectOptions> availableOptions = Lists.newArrayList();

        availableOptions.add(SelectOptions.OPTION_1);
        availableOptions.add(SelectOptions.OPTION_7);
        availableOptions.add(SelectOptions.OPTION_8);

        return availableOptions;
    }
    }

Model

public class ModelImpl implements Model {

    private SelectOptions selectOptions;

    /**
     * Simple Getter.
     *
     * @return the selectOptions
     */
    @Override
    public SelectOptions getSelectOptions() {
        return this.selectOptions;
    }

    /**
     * Simple Setter.
     *
     * @param selectOptions the selectOptions to set
     */
    @Override
    public void setSelectOptions(final SelectOptions selectOptions) {
        this.selectOptions = selectOptions;
    }


}
like image 609
Tony Card Avatar asked Feb 25 '13 18:02

Tony Card


2 Answers

It looks like the solution to this problem was that I was using the attribute "path" in the <spring-form:options> tag. It should have been "items", not "path".

the corrected JSP fragment:

<spring-form:select path="selectOptions">
    <spring-form:option value="" label="*** Select Option ***" />
    <spring-form:options items="${availableOptions}" />
</spring-form:select>
like image 182
Tony Card Avatar answered Nov 12 '22 11:11

Tony Card


If you created a spring controller and you want to pass an enum to your jsp page, you can do it like this:

Enum example:

public enum Coin {

    HEADS("Heads", "heads"),
    TAILS("Tails", "tails");

    private final String fullName;
    private final String shortName;

    private Coin(String fullName, String shortName) {
        this.fullName = fullName;
        this.shortName = shortName;
    }

    public String getFullName() {
        return fullName;
    }

    public String getShortName() {
        return shortName;
    }

}

Passing this enum to your model:

model.addObject("coins", Coin.values());

Using it in your jsp page with form:

<form:select path="selection">
    <form:options items="${coins}" itemValue="shortName" itemLabel="fullName" />
</form:select>
like image 40
zygimantus Avatar answered Nov 12 '22 11:11

zygimantus