[英]Constructor Dependency Injection in Spring MVC 3
我正在嘗試在控制器中進行依賴項注入,而不是使用setters方法,但這沒有用。
我想要的是:僅使用Springframework 3.1在控制器類中將域模型與表單綁定在一起。
我的網域類別:
public class Person {
private String name;
@Autowired
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
我的jsp(person-get):
<form action="test-person" method="post">
<table cellpadding="0" cellspacing="0" align="center">
<tr>
<td> <b> NAME: </b> </td>
<td> <input type="text" id="name" name="name"> </td>
</tr>
</table>
</form>
我的控制器:
@Controller
public class PersonController {
@RequestMapping(value = "test-person", method = RequestMethod.GET)
public String loadViewGet() {
return "person-get";
}
@RequestMapping(value = "test-person", method = RequestMethod.POST)
public String doPost(Person person, Model model) {
model.addAttribute("person", person);
return "person-post";
}
}
最后一個jsp顯示用戶輸入的人名(person-post):
<table cellpadding="0" cellspacing="0" align="center">
<tr>
<td> <b> NAME: </b> </td>
<td> ${person.name} </td>
</tr>
</table>
引發的異常:
java.lang.NoSuchMethodException: models.Person.<init>()
java.lang.Class.getConstructor0(Unknown Source)
java.lang.Class.getDeclaredConstructor(Unknown Source)
org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:104)
org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttri bute(ModelAttributeMethodProcessor.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodPr ocessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgu ment(ModelAttributeMethodProcessor.java:103)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resol veArgument(HandlerMethodArgumentResolverComposite.java:75)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValu es(InvocableHandlerMethod.java:156)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(Invo cableHandlerMethod.java:117)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod .invokeAndHandle(ServletInvocableHandlerMethod.java:96)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. handleInternal(RequestMappingHandlerAdapter.java:578)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(Abst ractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java :923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java: 852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.ja va:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
br.gov.sp.mococa.filtros.FiltroDeConexao.doFilter(FiltroDeConexao.java:31)
我認為春天正在尋找默認的構造函數whitout參數。 為什么要進行哈彭?
謝謝!
對於構造函數注入,您需要在spring上下文中或使用批注將bean聲明為spring bean。
但是我懷疑在用作formbean時是否會將參數作為構造函數傳遞。 Spring應該使用設置器設置參數。 使用標准構造函數並添加一個setter。
spring使用需要默認構造函數的反射創建對象。 在這里,您已經創建了一個參數化的構造函數,因此默認構造函數不可用。 所以提供默認的構造函數
您確定依賴注入是您想要的嗎? 您的代碼看起來更像您想要基於構造函數的表單綁定。
在后一種情況下,@ @ModelAttribute
批注可能@ModelAttribute
您有所幫助。
要基於請求參數創建模型屬性,可以使用@ModelAttribute
批注:
@ModelAttribute
public Person addPerson(@RequestParam String name) {
return new Person(name);
}
@RequestMapping(value = "test-person", method = RequestMethod.POST)
public String doPost(Model model) {
// model already contains "person"
return "person-post";
}
您還可以在RequestMapping
方法中接收模型值:
@RequestMapping(value = "test-person", method = RequestMethod.POST)
public String doPost(@ModelAttribute("person") Person person, Model model) {
// do someting with person..
return "person-post";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.