我有一个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反射方法?有关清洁解决方案的任何建议吗?
非常感谢。
答案 0 :(得分:1)
您可以使用@ModelAttribute
- 带注释的方法使用您的bean预填充模型。然后数据绑定器将使用该bean而不是实例化新的bean。但是,这会影响控制器的所有方法。
@ModelAttribute
public Entity createEntity() { ... }