2

Spring MVC コントローラーと jsp を使用した非常にシンプルでクラシックなページがあります (JSP はここでは関係ありません)。

@Controller
public class PlayListListController  extends BaseController<PlayList> {

    @Autowired UserRepository userRepository;

    @RequestMapping("/playlist/{userName}")
    private ModelAndView displayList(@PathVariable("userName") String userName) {
        User user = userRepository.getUserByUserName(userName);
        ....
    }

}

私の問題は次のとおりです。URL を使用して自分のページにアクセスしたい場合:http://localhost:8080/playlist/fooコントローラーの 8 行目で NullPointeurException がスローされます。

    User user = userRepository.getUserByUserName(userName);

デバッグすると、userRepository が実際に null であることがわかります。

userRepository は Spring によって注入されることになっていますが、私の他のすべてのコントローラーでは問題なく発生します。同じ Bean (userRepository) が、Sptring によって正しく注入されます。

インスタンス化され、Spring によって呼び出されるこの特定のコントローラー (他のすべてのコントローラーと同じパッケージにあります) で、userRepository が null になるのはなぜですか? まったくわかりません。どんな提案でも大歓迎です。

ありがとう!エミール。

4

2 に答える 2

7

このように進めたときに答えが見つかりました。最初に userRepository が注入されたかどうかを確認するために、コントローラーに @PostConstruct メソッドを作成しました。実際、@PostConstruct メソッドが実行されているとき、userRepository は null ではありませんでした。メソッドのデバッグ中に、オブジェクトの ID (Eclipse のビュー変数内) が 307 であることがわかりました。また、displayList メソッドをデバッグするときに、「this」はプロキシを示しました。SO、@postconstruct メソッド test() が Bean で実行されているように見えますが、@RequestMapping displayList メソッドはプロキシで実行されています。プロキシでは、userRepository は null になります。

では、なぜ @RequestMapping displayList() がプロキシで実行されているのでしょうか? その理由は、私のメソッドがprivateだったからです。displayList() を public メソッドにすると、すべて正常に動作します。

于 2013-08-13T14:46:49.410 に答える