Spring 3 Custom Editor замена поля - PullRequest
       27

Spring 3 Custom Editor замена поля

3 голосов
/ 05 апреля 2011

Имея мой ValueObject

UserVO {
  long id;
  String username;
}

Я создал собственный редактор для анализа этого объекта по строке 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 (String) к UserVO .. КАК ЭТО МАГИЯ ВОЗМОЖНА?

1 Ответ

0 голосов
/ 05 апреля 2011

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

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

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


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