Question

Can you have a @Initbinder on several data in the same form?

I have a spring form which contains a select dropdown of an object and two datafields, I have an Initbinder on the dates otherwise I get an error on submit. But I also need to bind the dropdown to an object.

I have a Type which has two dates and a Category, and it is the Category I need to bind because it can not be empty on save. I think it will help me to validate the form to. So can I have this in my Type controller?

@InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        binder.registerCustomEditor(Category.class, "category", new CategoryEditor(CategoryService));
}

And this is the Editor:

public class CategoryEditor extends PropertyEditorSupport {

    private CategoryService categoryService;

    public CategoryEditor(CategoryService categoryService) {
        this.categoryService = categoryService;
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (text.equals("0")) {
            this.setValue(null);
        } else {
            Category sc = categoryService.getCategory(Integer.parseInt(text));
            this.setValue(sc);
        }
    }

    @Override
    public String getAsText() {
        Category parent = new Category();
        if (this.getValue() != null) {
            parent = (Category) this.getValue();
        }
        return "";
    }
}

And my jsp-page

<s:url value="/mvc/type/save" var="actionUrl" />
<sf:form method="POST" modelAttribute="type" action="${actionUrl}">
    <fieldset>
        <legend><s:message code="${heading}" /></legend>
        <table>
            <tr>
                <th><label for="category"><s:message code="category" />:</label></th>
                <td><sf:select path="category.ID" id="category">
                        <sf:option value="0">&nbsp;</sf:option>
                        <sf:options items="${listOfCategories}" itemLabel="name" itemValue="ID" />
                    </sf:select></td>
            </tr>
            <tr>
                <th><label for="name"><s:message code="name" />:</label></th>
                <td><sf:input path="name" id="name" />
                    <sf:hidden path="ID" />
                    <sf:hidden path="version" /></td>
            </tr>
            <tr>
                <th><label for="marketing"><s:message code="marketing" />:</label></th>
                <td><sf:input path="marketingFunction" id="marketing" /></td>
            </tr>
            <tr>
                <th><label for="status"><s:message code="status" />:</label></th>
                <td><sf:select path="lifeCycleStatus">
                        <sf:option value="0">&nbsp;</sf:option>
                        <sf:options items="${listOfEnums}" />
                    </sf:select></td>
            </tr>
            <tr>
                <th><label for="validfrom"><s:message code="validfrom" />:</label></th>
                <td><sf:input path="validFrom" id="validfrom" /></td>
            </tr>
            <tr>
                <th><label for="validuntil"><s:message code="validuntil" />:</label></th>
                <td><sf:input path="validUntil" d="validuntil" /></td>
            </tr>
            <tr>
                <td colspan="2">
                    <input id="saveButton" class="right" type="submit" title="<s:message code="save" />" value=" [ <s:message code="save" /> ] " />
                </td>
            </tr>
        </table>
    </fieldset>
</sf:form>

So my question: Can I have multiple binder in the same initBinder in my controller? It seems like I can't because I never enter the CategoryEditor. How do I do this?

Was it helpful?

Solution

There aren't multiple binders, there are multiple PropertyEditors.

Your custom one is never called because you are binding the wrong path.

<sf:select path="category.ID" id="category">

You must bind to category and not category.ID

<sf:select path="category" id="category">
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top