Замена поля пользовательского редактора Spring 3

#spring #spring-mvc #propertyeditor

#spring #spring-mvc #propertyeditor

Вопрос:

Наличие моего ValueObject

 UserVO {
  long id;
  String username;
}
  

Я создал пользовательский редактор для синтаксического анализа этого объекта из string id#username

 public class UserVOEditor extends PropertyEditorSupport {

@Override
public void setAsText(String text) throws IllegalArgumentException {
    Preconditions.checkArgument(text != null,"Null argument supplied when parsing UserVO");
    String[] txtArray = text.split("\#");
    Preconditions.checkArgument(txtArray.length == 2, "Error parsing UserVO. Expected: id#username");
    long parsedId = Long.valueOf(txtArray[0]);
    String username = txtArray[1];
    UserVO uvo = new UserVO();
    uvo.setUsername(username);
    uvo.setId(parsedId);
    this.setValue(uvo);
}

@Override
public String getAsText() {
    UserVO uvo = (UserVO) getValue();
    return uvo.getId() '#' uvo.getUsername();
}
  

в моем контроллере я регистрирую

 @InitBinder
public void initBinder(ServletRequestDataBinder binder) {
    binder.registerCustomEditor(UserVO.class, new UserVOEditor());
}
  

наличие в моей модели объекта ModelVO

 ModelVO { 
           Set<UserVO> users = new HashSet<UserVO>();
}
  

после вызова пользовательского редактора все, что вы можете увидеть после отправки формы, это

 ModelVO {
          Set<String> users (linkedHashSet)
}
  

поэтому при попытке выполнить итерацию

 for(UserVO uvo : myModel.getUser()){ .. }
  

У меня ClassCastException .. не удается привести 1234 #username (строку) к UserVO ..
КАК ВОЗМОЖНО ЭТО ВОЛШЕБСТВО?

Ответ №1:

Это не волшебство, это из-за того, что дженерики будут проверены только во время компиляции. Таким образом, вы можете поместить каждую вещь в набор во время выполнения, никто не будет проверять, ввели ли вы правильный тип в набор.

Что вы можете попробовать, чтобы сделать spring немного более умным, так это поместить ModelVO в свой командный объект.

 <form:form action="whatEver" method="GET" modelAttribute="modelVO">


@RequestMapping(method = RequestMethod.GET)
public ModelAndView whatEver(@Valid ModelVO modelVO){
   ...
}
  

Комментарии:

1. @Jan: Кстати, в Spring 3.0 есть концепция org.springframework.core.convert.converter. Конвертер. Это похоже на односторонний редактор свойств, но он не имеет состояния и из-за этого гораздо более производителен.

2. Оно там 😉 Хорошо. Итак, теперь я выяснил, что правильный способ регистрации пользовательских редакторов для коллекций — binder.registerCustomEditor(Set.class , «получатели», новый CustomCollectionEditor(…){ .. } ); с реализованным convertElement. Итак, я это сделал. Во время отладки выполняется convertElement, однако после отправки формы список по-прежнему не заполняется (содержит 0 элементов 🙂

3. @Jan: > Во время выполнения отладки convertElement, однако после отправки формы список все еще не заполняется — Отправьте новый вопрос, содержащий ваш JSP и контроллер