2010-04-01 37 views
1

我有一個Spring MVC應用程序試圖利用豐富的域模型,與控制器類下面的映射:定製的bean的實例化邏輯


    @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()。當他們從數據庫中檢索時,我有一個攔截器,它覆蓋了方法並將工廠掛接到該方法。

所以這裏最後一塊缺少的難題是如何強制Spring使用工廠而不是自己的BeanUtils反射方法?任何建議乾淨的解決方案?

非常感謝。

回答

1

您可以使用@ModelAttribute -annotated方法預先使用bean填充模型。然後數據綁定器將使用該bean而不是實例化新的bean。但是,這會影響控制器的所有方法。

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