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もブラケットにしてみました。
よりきれいですね。

コメント

タイトルとURLをコピーしました