Я следую этой схеме в приложении Spring.
- Запрос отправляется на сервер с идентификатором объекта и некоторыми другими параметрами, которые будут заполнены в этом объекте
- Объект с этим идентификатором загружается из базы данных
- getters и seters вызывается в этом объекте для заполнения значений
- объект затем сохраняется
Я спросил в этом другом вопросе, что было лучшим способом подготовить объект перед заполнением параметров запроса. Ответ заключался в том, что лучшим способом было использовать службу преобразования вместо того, чтобы делать это в аннотированном методе @ModelAtribute или с редактором в initBinder,
Итак, я попытался использовать конвертер, но я не нашел подобного примера, и я немного застрял. Я написал код, подобный приведенному ниже: В связывании init я регистрирую службу преобразования. Поэтому перед заполнением значений метода User object convert() вызывается для загрузки объекта из базы данных. Проблема заключается в том, что эта конфигурация не работает, потому что она преобразует идентификатор (имя пользователя) объекта 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);
}
}