Пользовательская логика создания бинов в Spring MVC - PullRequest
1 голос
/ 01 апреля 2010

У меня есть приложение 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? Любые предложения для чистого решения?

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

1 Ответ

1 голос
/ 01 апреля 2010

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

@ModelAttribute
public Entity createEntity() { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...