Spring MVC中的自定义bean实例化逻辑

时间:2010-04-01 13:39:57

标签: spring 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托管bean。这样做的原因是为它们注入DAO。我使用new而不是调用EntityFactory.createEntity()。当从数据库中检索它们时,我有一个覆盖

的拦截器
public Object instantiate(String entityName, EntityMode entityMode, Serializable id)

方法并将工厂挂钩。

所以这里缺少的最后一块拼图是如何强制Spring使用工厂而不是自己的BeanUtils反射方法?有关清洁解决方案的任何建议吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用@ModelAttribute - 带注释的方法使用您的bean预填充模型。然后数据绑定器将使用该bean而不是实例化新的bean。但是,这会影响控制器的所有方法。

@ModelAttribute
public Entity createEntity() { ... }