Java SpringMVC3中的构造函数依赖注入

Java SpringMVC3中的构造函数依赖注入,java,spring,Java,Spring,我试图在我的控制器中进行依赖项注入,而不是使用setters方法,但它不起作用 我想要的是:只需使用springframework 3.1在控制器类中用我的表单绑定域模型 我的域类: public class Person { private String name; @Autowired public Person(String name) { this.name = name; } public String getName() { return t

我试图在我的控制器中进行依赖项注入,而不是使用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(个人获取):

最后一个jsp显示用户输入的人名(person post):


姓名:
${person.name}
被抛出的例外:

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)
java.lang.NoSuchMethodException:models.Person.()
java.lang.Class.getConstructor0(未知源)
java.lang.Class.getDeclaredConstructor(未知源)
org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:104)
org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttri bute(ModelAttributeMethodProcessor.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodPr处理器.createAttribute(ServletModelAttributeMethodProcessor.java:81)
org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgu(ModelAttributeMethodProcessor.java:103)
org.springframework.web.method.support.HandlerMethodArgumentResolveComposite.resol veArgument(HandlerMethodArgumentResolveComposite.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(AbstractHandlerMethodAdapter.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)
javaservlet.http.HttpServlet.service(HttpServlet.java:641)
javaservlet.http.HttpServlet.service(HttpServlet.java:722)
br.gov.sp.mococa.filtros.FiltroDeConexao.doFilter(FiltroDeConexao.java:31)
我认为spring正在寻找一个没有参数的默认构造函数。为什么会这样


谢谢

对于构造函数注入,您需要将bean声明为spring上下文中的Springbean或带有注释的Springbean


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

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

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

在后一种情况下,
@modeldattribute
注释可能会对您有所帮助

要基于请求参数创建模型属性,可以使用
@modeldattribute
注释:

@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";
}

请参阅和

在ApplicationContext中声明Person bean的位置和方式?问题是您没有无参数构造函数(
public Person(){
,这是框架试图调用的)已定义。还有,为什么要在
Person
中自动连接
name
?在定义bean时应该只传递一个值。您好,感谢您的提示!所以,这就是问题所在:如果我放置默认构造函数,框架将使用setter方法进行依赖项注入,我想使用构造函数注入方法。我知道这一点有办法做到这一点,但不知道怎么做。再次感谢!您好,感谢您的关注!所以,我已经做了两种方法,您播种我,但没有工作。HTTP错误400。关于依赖注入,我指的是spring MVC的内部DI-它传递对象人与DI,我是对的?完成,你是对的,我正在尝试绑定一个表单与我的域。使用setter方式可能会损害我的对象的业务—不是在这个简单的情况下,而是在另一个情况下。这就是我担心的问题。“对于构造函数注入,您需要在spring上下文中声明bean为spring bean,或者使用注释。”我这样做了,但是我不能设置从POST数据传递到我的模型的属性值——我认为Spring MVC使用反射和setter方法来实现这一点。我现在应该怎么做?谢谢!
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)
@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(value = "test-person", method = RequestMethod.POST)
public String doPost(@ModelAttribute("person") Person person, Model model) {
    // do someting with person..    
    return "person-post";
}