0

これで私を助けてくれることを願っています。

Web アプリケーションで Spring MVC (3.1.1) を使用していますが、奇妙な状況に直面しています。ServicioUsuario サービスを利用するこの単純な @Controller があり、正常に動作します。

@Controller
@RequestMapping("/ajax")
public class ControladorAjax extends ControladorGenerico {

  @Autowired
  ServicioUsuario servicioUsuario;

  @RequestMapping("/check")
  public ResponseEntity<String> check(@RequestParam String email) {
    // Declarations and other operations omitted...
    // Use servicioUsuario
    servicioUsuario.doStuff();
    return response;
  }
}

ただし、@Autowiring を削除し、Spring をservicioUsuarioパラメーターとして挿入しようとすると (つまり、メソッド シグネチャを : に変更することによってpublic ResponseEntity<String> check(@RequestParam String email, ServicioUsuario servicioUsuario))、すべてが壊れ、Tomcat のログに次のような例外が表示されます。

javax.servlet.ServletException: NestedServletException in java.lang.Thread.getStackTrace:: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.package.ServicioUsuario]: Specified class is an interface

私はこれらのインターフェースを持っています:

com.package
  |-> Servicio.java (interface)
  |-> ServicioUsuario.java (interface that extends Servicio)

およびこれらのクラス:

com.package.impl
  |-> ServicioImpl.java (implements Servicio)
  |-> ServicioUsuarioImpl.java (@Service("servicioUsuario") that extends ServicioImpl implements ServicioUsuario)

そして、両方のパッケージをスキャンするようにSpringを構成しました:

<context:component-scan base-package="com.package
                                      com.package.impl" />

Spring が実装クラスではなくインターフェイスをインスタンス化しようとするのはなぜですか? それは私が間違っていることですか?

4

1 に答える 1

5

公式ドキュメントの16.3.3.1 Supported method argument typesによると、これはコントローラーメソッドが取ることができるものの完全なリストです:

  • リクエストまたはレスポンス オブジェクト (サーブレット API)。[...] たとえばServletRequest、またはHttpServletRequest

  • セッション オブジェクト (サーブレット API): タイプHttpSession

  • org.springframework.web.context.request.WebRequestまたはorg.springframework.web.context.request.NativeWebRequest

  • java.util.Locale現在のリクエストロケール [...]

  • java.io.InputStream/java.io.Readerリクエストのコンテンツへのアクセス用。[...]

  • java.io.OutputStream/java.io.Writerレスポンスのコンテンツを生成するため。[...]

  • java.security.Principal現在認証されているユーザーを含みます。

  • @PathVariableURI テンプレート変数にアクセスするための注釈付きパラメーター。[...]

  • @RequestParam特定のサーブレット要求パラメーターにアクセスするための注釈付きパラメーター。[...]

  • @RequestHeader特定のサーブレット要求 HTTP ヘッダーにアクセスするための注釈付きパラメーター。[...]

  • @RequestBodyHTTP リクエスト本文にアクセスするための注釈付きパラメーター。[...]

  • @RequestPart「multipart/form-data」リクエスト パーツのコンテンツにアクセスするための注釈付きパラメータ。[...]

  • HttpEntity<?>サーブレット要求の HTTP ヘッダーとコンテンツにアクセスするためのパラメーター。[...]

  • java.util.Map/ org.springframework.ui.Model/ org.springframework.ui.ModelMap[...]

  • org.springframework.web.servlet.mvc.support.RedirectAttributes[...]

  • リクエスト パラメータを Bean プロパティ (セッター経由) または直接フィールドにバインドするコマンドまたはフォーム オブジェクト [...]

  • org.springframework.validation.Errors/ org.springframework.validation.BindingResult[...]

  • org.springframework.web.bind.support.SessionStatus[...]

  • org.springframework.web.util.UriComponentsBuilder[...]

ご覧のとおり、Spring Bean はこの (非常に印象的な) リストに含まれていません。コントローラーメソッドを介してサービスを注入するのはなぜですか? それらは決して変わりません。一度注入してフィールドに割り当てるだけで十分です。

于 2012-11-10T15:10:47.550 に答える