InitBinder для нескольких объектов формы

Можете ли вы иметь @Initbinder для нескольких данных в одной и той же форме?

У меня есть пружинная форма, которая содержит раскрывающийся список выбора объекта и два поля данных, у меня есть Initbinder для дат, иначе я получаю сообщение об ошибке при отправке. Но мне также нужно привязать раскрывающийся список к объекту.

У меня есть тип, который имеет две даты и Category, и это Category, который мне нужно связать, потому что он не может быть пустым при сохранении. Я думаю, это поможет мне проверить форму. Могу ли я иметь это в моем контроллере Type?

@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));
}

А это Редактор:

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 "";
    }
}

И моя jsp-страница

<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>

Итак, мой вопрос: могу ли я иметь несколько связующих в одном и том же initBinder в моем контроллере? Кажется, я не могу, потому что я никогда не вхожу в CategoryEditor. Как мне это сделать?


person user2018311    schedule 06.03.2014    source источник


Ответы (1)


Нет нескольких подшивок, есть несколько PropertyEditors.

Ваш пользовательский никогда не вызывается, потому что вы привязываете неправильный путь.

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

Вы должны выполнить привязку к category, а не к category.ID

<sf:select path="category" id="category">
person M. Deinum    schedule 06.03.2014
comment
Ааа спасибо! :) Теперь мой редактор называется. Но теперь выбран последний элемент в раскрывающемся списке, и если я посмотрю на исходный код, все элементы в раскрывающемся списке будут выбраны = выбраны. Можно ли выделить только верхний элемент? - person user2018311; 06.03.2014
comment
Ваш CategoryEditor неисправен. Ваш getAsText всегда возвращает "", тогда как вам, вероятно, следует возвращать идентификатор. - person M. Deinum; 06.03.2014
comment
Я думаю, что использовал path=category.ID, потому что я использую ту же форму для редактирования Типа. Если я не использую path=category.ID, категория не выбирается, когда я редактирую тип. Так что теперь это не работает. - person user2018311; 06.03.2014
comment
Вы редактируете category, поэтому вам нужно это исправить. Если вы используете идентификатор, вы можете получить ситуацию, когда категория внезапно получает другой идентификатор или один из них перезаписывается другим. Ваша текущая проблема в основном связана с некорректным/неправильным CategoryEditor. - person M. Deinum; 06.03.2014