6

私はSpring 2.5を使用しており、注釈を使用してコントローラーを構成しています。追加のインターフェイスを実装しない場合、コントローラーは正常に動作しますが、インターフェイスの実装を追加すると、Spring コンテナーはコントローラーと要求のマッピングを認識しません。

インターフェイスの実装を追加すると、コントローラーの構成と要求のマッピングが台無しになる理由がわかりません。何か案は?

したがって、これは機能します:

package com.shaneleopard.web.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.providers.encoding.Md5PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.shaneleopard.model.User;
import com.shaneleopard.service.UserService;
import com.shaneleopard.validator.RegistrationValidator;
import com.shaneleopard.web.command.RegisterCommand;

@Controller
public class RegistrationController {

    @Autowired
    private UserService userService;

    @Autowired
    private Md5PasswordEncoder passwordEncoder;

    @Autowired
    private RegistrationValidator registrationValidator;

    @RequestMapping( method = RequestMethod.GET, value = "/register.html" )
    public void registerForm(@ModelAttribute RegisterCommand registerCommand) {
        // no op
    }

    @RequestMapping( method = RequestMethod.POST, value = "/register.html" )
    public String registerNewUser( @ModelAttribute RegisterCommand command,
            Errors errors ) {
        String returnView = "redirect:index.html";

        if ( errors.hasErrors() ) {
            returnView = "register";
        } else {
            User newUser = new User();
            newUser.setUsername( command.getUsername() );
            newUser.setPassword( passwordEncoder.encodePassword( command
                    .getPassword(), null ) );
            newUser.setEmailAddress( command.getEmailAddress() );
            newUser.setFirstName( command.getFirstName() );
            newUser.setLastName( command.getLastName() );

            userService.registerNewUser( newUser );
        }
        return returnView;

    }

    public Validator getValidator() {
        return registrationValidator;
    }
}

しかし、これはしません:

package com.shaneleopard.web.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.providers.encoding.Md5PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.shaneleopard.model.User;
import com.shaneleopard.service.UserService;
import com.shaneleopard.validator.RegistrationValidator;
import com.shaneleopard.web.command.RegisterCommand;

@Controller
public class RegistrationController extends ValidatingController {

    @Autowired
    private UserService userService;

    @Autowired
    private Md5PasswordEncoder passwordEncoder;

    @Autowired
    private RegistrationValidator registrationValidator;

    @RequestMapping( method = RequestMethod.GET, value = "/register.html" )
    public void registerForm(@ModelAttribute RegisterCommand registerCommand) {
        // no op
    }

    @RequestMapping( method = RequestMethod.POST, value = "/register.html" )
    public String registerNewUser( @ModelAttribute RegisterCommand command,
            Errors errors ) {
        String returnView = "redirect:index.html";

        if ( errors.hasErrors() ) {
            returnView = "register";
        } else {
            User newUser = new User();
            newUser.setUsername( command.getUsername() );
            newUser.setPassword( passwordEncoder.encodePassword( command
                    .getPassword(), null ) );
            newUser.setEmailAddress( command.getEmailAddress() );
            newUser.setFirstName( command.getFirstName() );
            newUser.setLastName( command.getLastName() );

            userService.registerNewUser( newUser );
        }
        return returnView;

    }

    public Validator getValidator() {
        return registrationValidator;
    }
}
4

3 に答える 3

3

layne、コントローラー クラスがインターフェイスを実装するときに問題が発生すると説明しましたが、提供したコード サンプルでは、​​コントローラー クラスが別のクラスを拡張するときに問題が発生しますValidatingController

@Controllerおそらく、親クラスでもいくつかの Spring アノテーションが定義されており、Spring コンテナーは最初にそれらに気づき、コントローラー クラスをそのタイプの管理対象オブジェクトとして分類し、サブクラスでも定義したアノテーションをわざわざチェックしませんでした。単なる推測ですが、それがうまくいく場合は、バグのように聞こえるので、Spring チームに報告することをお勧めします。

于 2008-10-13T03:37:03.350 に答える
1

デフォルトでは、JDK プロキシはインターフェイスを使用して作成されます。コントローラーがインターフェイスを実装する場合、targetClass が使用されていないため、RequestMapping アノテーションは無視されます。

これをサーブレット コンテキスト構成に追加します。

<aop:aspectj-autoproxy proxy-target-class="true"/>
于 2013-06-06T19:42:47.670 に答える
0

問題は継承と注釈の使用に関係していることに気付くと思いますが、それらはうまく混ざりません。

継承と SimpleFormController を使用して上記を実装し、他のすべての詳細をアプリケーション コンテキストで構成しようとしましたか? これにより、少なくとも問題を注釈と継承の問題に絞り込むことができます。

于 2008-10-09T01:23:53.773 に答える