2010-06-11 58 views
1

這裏去這需要從Spring表單填充命令對象關於使用Spring框架創建實例的問題?

public class Person { 

    private String name; 
    private Integer age;  

    /** 
     * on-demand initialized 
     */ 
    private Address address; 

    // getter's and setter's 

} 

和地址

public class Address { 

    private String street; 

    // getter's and setter's 

} 

現在假設下面的MultiActionController

@Component 
public class PersonController extends MultiActionController { 

    @Autowired 
    @Qualifier("personRepository") 
    private Repository<Person, Integer> personRepository; 

    /** 
     * mapped To /person/add 
     */ 
    public ModelAndView add(HttpServletRequest request, HttpServletResponse response, Person person) throws Exception { 
     personRepository.add(person); 

     return new ModelAndView("redirect:/home.htm"); 
    } 

} 

因爲人需要地址屬性按需初始化,我需要覆蓋newCommandObject創建Person的實例來啓動地址屬性。否則,我會得到NullPointerException異常

@Component 
public class PersonController extends MultiActionController { 

    /** 
     * code as shown above 
     */ 

    @Override 
    public Object newCommandObject(Class clazz) thorws Exception { 
     if(clazz.isAssignableFrom(Person.class)) { 
      Person person = new Person(); 
      person.setAddress(new Address()); 

      return person; 
     } 
    } 

} 

好,專家Spring MVC和Web Flow的說,對備選對象創建

選項包括將BeanFactory拉一個實例或使用方法注入透明地返回新實例。

首先選擇

  • 將BeanFactory拉一個實例

可以寫成

@Override 
public Object newCommandObject(Class clazz) thorws Exception { 
    /** 
     * Will retrieve a prototype instance from ApplicationContext whose name matchs its clazz.getSimpleName() 
     */ 
    getApplicationContext().getBean(clazz.getSimpleName()); 
} 

但到底是什麼,他想用方法注入到由透明返回一個新的inst ance ???你能展示我如何實現他所說的嗎?

ATT:我知道這個funcionality可以由SimpleFormController而不是MultiActionController來填充。但它只是作爲一個例子顯示,沒有別的

+0

你有使用'MultiActionController'的原因嗎?它在Spring 3中被棄用了,你真的應該使用'@ Controller'來代替它,這很容易。 – skaffman 2010-06-11 20:32:42

+0

@skaffman對不起,我不使用Spring 3。0(我知道它在Spring 3.0中被棄用),我可以通過配置獲得相同的約定,而無需Spring 3.0 MVC註釋。謝謝! – 2010-06-11 20:36:59

+0

你也可以在Spring 2.5中使用'@ Controller',你不需要3.0。命令 - 對象綁定更容易理解。而且你的代碼已經充斥着Spring MVC註解,我不明白你不願意使用'@ Controller'。 – skaffman 2010-06-11 20:39:32

回答

1

我敢肯定,他的意思是使用lookup-method系統中chapter 3 of the spring reference manual

只有記錄下來的一面是,<lookup-method>需要一個沒有ARG方法,而不是newCommandObject(Class)方法MultiActionController

public abstract class PersonController extends MultiActionController { 

    /** 
     * code as shown above 
     */ 

    @Override 
    public Object newCommandObject(Class clazz) thorws Exception { 
     if(clazz.isAssignableFrom(Person.class)) { 
      return newPerson(); 
     } 
    }       

    public abstract Person newPerson(); 
} 
在上下文文件

這可以用類似來解決

<bean id="personController" class="org.yourapp.PersonController"> 
    <lookup-method name="newPerson" bean="personPrototype"/> 
</bean> 

的一面是,使用這樣的事情是你有點卡住配置控制器通過xml bean這是不可能的(當然在< 3)做到這一點與註釋。

+0

謝謝。我想你是對的。沒有辦法通過使用Spring註釋來獲得相同的行爲? – 2010-06-12 20:38:00