0

我正在尝试在我的控制器中进行依赖注入,而不是使用 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)

我认为spring正在寻找一个默认的构造函数,没有参数。为什么会发生?

谢谢!

4

3 回答 3

0

对于构造函数注入,您需要在 spring-context 中或使用注释将 bean 声明为 spring bean。

但是我怀疑它在用作formbean时是否会将参数作为构造函数传递。Spring 应该使用 setter 设置参数。使用标准构造函数并添加一个 setter。

于 2013-06-20T17:56:50.750 回答
0

spring 使用反射创建需要默认构造函数的对象。在这里,您创建了一个参数化构造函数,因此默认构造函数不可用。所以提供默认构造函数

于 2013-06-20T17:57:52.360 回答
0

你确定依赖注入是你想要的吗?您的代码看起来更像您想要基于构造函数的表单绑定。

在后一种情况下,@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

于 2013-06-20T18:06:12.310 回答