這裏去這需要從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來填充。但它只是作爲一個例子顯示,沒有別的
你有使用'MultiActionController'的原因嗎?它在Spring 3中被棄用了,你真的應該使用'@ Controller'來代替它,這很容易。 – skaffman 2010-06-11 20:32:42
@skaffman對不起,我不使用Spring 3。0(我知道它在Spring 3.0中被棄用),我可以通過配置獲得相同的約定,而無需Spring 3.0 MVC註釋。謝謝! – 2010-06-11 20:36:59
你也可以在Spring 2.5中使用'@ Controller',你不需要3.0。命令 - 對象綁定更容易理解。而且你的代碼已經充斥着Spring MVC註解,我不明白你不願意使用'@ Controller'。 – skaffman 2010-06-11 20:39:32