0

セッター メソッドを使用する代わりに、コントローラーで依存性注入を実行しようとしていますが、うまくいきませんでした。

私が望むこと: 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)

春はパラメーターなしのデフォルトのコンストラクターを探していると思います。なぜそれが起こっているのですか?

ありがとう!

4

3 に答える 3

0

コンストラクター注入の場合、Spring コンテキストまたはアノテーションを使用して、Bean を Spring Bean として宣言する必要があります。

ただし、フォームビーンとして使用する場合、パラメーターをコンストラクターとして渡すとは思えません。Spring はセッターでパラメーターを設定する必要があります。標準コンストラクターを使用し、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 に答える