Spring 5 Binder, @InitBinder, неправильно заполняет модель - PullRequest
0 голосов
/ 27 октября 2018

Я обновляю веб-приложение Spring 2.5 до Spring 5.0.3.Я использую строковые теги формы.В моем контроллере у меня есть:

@InitBinder
public void initBinder(WebDataBinder binder, HttpServletRequest request) {

    CapTypeEditor capTypeEditor = new CapTypeEditor(this.getDAOFactory());
    binder.registerCustomEditor(CapType.class, "order.capType.id", capTypeEditor);
}

Я вижу, что это вызывается дважды (почему?) На GET и дважды на POST.На GET request.getParameter ("order.capType.id") имеет значение null, то же самое в POST имеет правильный идентификатор.Но затем в моем POST-методе submit () capType не имеет значение null, но имеет только заполненный идентификатор, а не его имя:

@RequestMapping(value = "/es/orderinfo.html", method=RequestMethod.POST)
public ModelAndView submit(@RequestParam("id") long id,
        @ModelAttribute("command")OrderInfoBean bean, 
          BindingResult errors, ModelMap model,
          HttpServletRequest request) { 


    Order order = bean.getOrder();
    CapType ct = order.getCapType();
...
}

Мой редактор CapType никогда не вызывается:

public class CapTypeEditor extends PropertyEditorSupport {

DAOFactory daoFactory;

public CapTypeEditor(DAOFactory daoFactory){
    this.daoFactory = daoFactory;       
}

public void setAsText(String text){
    if(StringUtils.isBlank(text)||StringUtils.isEmpty(text) ){
        this.setValue(null);
        return;
    }
    Long id = Long.valueOf(text);
    CapType capType = daoFactory.getCapTypeDAO().read(id);
    this.setValue(capType);
}

public String getAsText(Object value){
    if(value == null) return StringUtils.EMPTY;
    CapType capType  = (CapType)value;
    return capType.getId().toString();
}
}

Мой JSP выглядит так:

<form:select path="order.orderType.id" tabindex="100" cssStyle="width:149px">
    <form:option value="">none</form:option>
    <form:options items="${refData.orderTypes }" itemValue="id" itemLabel="typeName" />                                 
</form:select>

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

На самом деле мои старые редакторы, зарегистрированные в @InitBinder, были в порядке.И @minarmahmud был прав насчет отсутствия .id в.После того, как я добавил правильные функции равенства и хэш-кода в мои классы отображенных моделей гибернации (например, CapType), все работало, как значения по умолчанию в представлении HTML, так и полное автоматическое сопоставление моих моделей вместе в POST.Так в модели CapType:

@Override
public boolean equals(final Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    final CapType capType = (CapType) o;
    return Objects.equals(id, capType.id) &&
    Objects.equals(typeName, capType.getTypeName());
}
@Override
public int hashCode() {
    return Objects.hash(id, typeName);
}
0 голосов
/ 27 октября 2018

Вы указали неверный путь свойства при регистрации пользовательского редактора. Сделайте это:

binder.registerCustomEditor(CapType.class, "capType", capTypeEditor);

Предположим, OrderInfoBean содержит поле capType.

binder.registerCustomEditor(CapType.class, "order.capType", capTypeEditor);

Как OrderInfoBean Котны Order, которые содержат CapType.

А в JSP используйте capType order.capType непосредственно в качестве bindpath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...