2014-03-06 4 views
0

У вас есть @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. Как мне это сделать?

ответ

1

Не существует нескольких связующих, существует несколько PropertyEditors.

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

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

Вы должны связываться с category и не category.ID

<sf:select path="category" id="category"> 
+0

Ahh спасибо! :) Теперь вызывается мой редактор. Но теперь выбирается последний элемент в dropdown, и если я смотрю на исходный код, все элементы в раскрывающемся списке имеют «selected = selected». Можно ли выбрать только верхний элемент? – user2018311

+0

Ваш «CategoryEditor» испорчен. Ваш 'getAsText' всегда возвращает' '' ', тогда как вы, вероятно, должны возвращать идентификатор. –

+0

Я думаю, что я использовал path = category.ID, потому что я использую ту же форму для редактирования Type. Если я не использую path = category.ID, эта категория не будет выбрана, когда я захочу изменить тип. Так что теперь это не работает. – user2018311