Пользовательская логика создания экземпляров bean-компонентов в Spring MVC

У меня есть приложение Spring MVC, пытающееся использовать богатую модель предметной области со следующим сопоставлением в классе Controller:


    @RequestMapping(value = "/entity", method = RequestMethod.POST)
    public String create(@Valid Entity entity, BindingResult result, ModelMap modelMap) {
        if (entity== null) throw new IllegalArgumentException("An entity is required");
        if (result.hasErrors()) {
            modelMap.addAttribute("entity", entity);
            return "entity/create";
        }
        entity.persist();
        return "redirect:/entity/" + entity.getId();
    }

Прежде чем этот метод будет выполнен, Spring использует BeanUtils для создания нового экземпляра Entity и заполнения его полей. Он использует это:


  ...
  ReflectionUtils.makeAccessible(ctor);
  return ctor.newInstance(args);

Вот проблема:

Мои объекты - это управляемые компоненты Spring. Причина этого заключается в том, чтобы внедрить в них DAO. Вместо вызова new я использую EntityFactory.createEntity(). Когда они извлекаются из базы данных, у меня есть перехватчик, который переопределяет

public Object instantiate(String entityName, EntityMode entityMode, Serializable id)

метод и подключает к нему фабрики.

Таким образом, последняя часть головоломки, отсутствующая здесь, — это как заставить Spring использовать фабрику, а не собственный рефлексивный подход BeanUtils? Любые предложения для чистого решения?

Большое спасибо заранее.


person Michal Bachman    schedule 01.04.2010    source источник


Ответы (1)


Вы можете использовать @ModelAttribute-аннотированный метод для предварительного заполнения модели вашим bean-компонентом. Затем средство связывания данных будет использовать этот компонент вместо создания экземпляра нового. Однако это повлияет на все методы контроллера.

@ModelAttribute
public Entity createEntity() { ... }
person axtavt    schedule 01.04.2010