Я придерживаюсь этой схемы в приложении Spring.
- На сервер отправляется запрос с идентификатором объекта и некоторыми другими параметрами, которые нужно заполнить в этом объекте
- Объект с этим идентификатором загружается из базы данных
- В этом объекте вызываются геттеры и сеттеры для заполнения значений
- затем объект сохраняется
Iспросил в этот другой вопрос , как лучше всего подготовить объект перед заполнением параметров запроса.Ответ был таков: лучше всего использовать сервис преобразования вместо того, чтобы делать это с помощью аннотированного метода @ModelAtribute или с редактором в initBinder.
Итак, я попытался использовать конвертер, но я не нашел подобного примера, и я немного застрял.Я написал код, подобный приведенному ниже: в привязке init я регистрирую службу преобразования.Поэтому перед заполнением значений в пользовательском объекте вызывается метод convert () для загрузки объекта из базы данных.Проблема в том, что эта конфигурация не работает, потому что она конвертирует id (поле имени пользователя) пользователя Object в пользователя Object, но затем пытается создать setUsername () с объектом, чтобы я получил «java.lang»..IllegalArgumentException: несоответствие типа аргумента ".
Может кто-нибудь дать мне подсказку или пример использования ConversionService для получения желаемого поведения?
Спасибо.
@Autowired
private ConversionService conversionService;
@InitBinder("user")
public void initBinder(@RequestParam("username")String username, WebDataBinder binder){
binder.setConversionService(conversionService);
}
@RequestMapping(value="/user/save", method=RequestMethod.POST)
public String save(@ModelAttribute("user") User user, Model model) {
...
}
с чем-то вроде:
@Component
public class UserConversionService implements ConversionService{
...
@Override
public Object convert(Object name, TypeDescriptor arg1, TypeDescriptor arg2) {
return userService.find((String)name);
}
}