簡體   English   中英

Spring MVC 3中的構造函數依賴注入

[英]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";
}

請參見在方法參數上 使用@ModelAttribute在方法上使用@ModelAttribute

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM