Spring Web MVCのControllerをkotlinに変更した際に@Autowired指定したコンポーネントがインジェクションされずnullになる件

これは2017/12/22時点のIntelliJ IDEA(2017.3)を使用した記事です。
最新版とは異なる可能性がありますのでご注意ください。

下記のようなJavaのクラスがあったとします。

@Controller
@Scope("request")
@RequestMapping("/foo/bar")
public class FooBarController: Foo() {
    @Autowired
    FooBarService fooBarService;
 
    @RequestMapping(method = RequestMethod.GET)
    public String foo() {
        return fooBarService.doSomething();
    }
}

これをkoilinに自動変換するとこうなります。

@Controller
@Scope("request")
@RequestMapping("/foo/bar")
class FooBarController {
    @Autowired
    internal var fooBarService: FooBarService? = null
 
    @RequestMapping(method = arrayOf(RequestMethod.GET))
    fun foo(): String {
        return fooBarService!!.doSomething()
    }
}

このままだとfooBarServiceのAutowiredが効かずnullのままになってしまいます。

そこで、ここで回答されているように、

@Controller
@Scope("request")
@RequestMapping("/foo/bar")
open class FooBarController(val fooBarService: FooBarService) {
    @RequestMapping(method = [RequestMethod.GET])
    open fun foo(): String {
        return fooBarService.doSomething()
    }
}

classとfunにopenをつけることでAutowiredが効くようになります。
ついでに@Autowiredを外してコンストラクタに移動させ、methodのarraysもブラケットにしてみました。
よりきれいですね。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください