web-dev-qa-db-ja.com

kotlinおよび@Valid Springアノテーション

私はエンティティを持っています:

class SomeInfo(
        @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) {
    var id: Long? = null
}

そしてコントローラメソッド:

@RequestMapping(value = "/some-info", method = RequestMethod.POST)
public Id create(@Valid @RequestBody SomeInfo someInfo) {
       ...
    }

@Validアノテーションが機能しません。

Springはデフォルトのパラメーターなしのコンストラクターを必要とするようで、上記の豪華なコードは次のように醜く(しかし機能します)なります。

class SomeInfo() {

    constructor(value: String) {
            this.value = value
        }

        @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) 
        lateinit var value: String

        var id: Long? = null
    }

それを簡潔にするための良い習慣はありますか?

ありがとう。

29
fasth

Springはこれらのアノテーションをフィールドに適用する必要があるようです。ただし、Kotlinはこれらのアノテーションをコンストラクターパラメーターに適用します。使用する field:注釈を適用してフィールドに適用する場合の指定子。次のコードは問題なく機能するはずです。

class SomeInfo(
    @field:NotNull
    @field:Pattern(regexp = Constraints.EMAIL_REGEX)
    var value: String
) {
    var id: Long? = null
}
62
Michael

Michalの回答の代わりに、ゲッターに注釈を付けることもできます。

class SomeInfo(
    @get:NotNull
    @get:Pattern(regexp = Constraints.EMAIL_REGEX)
    var value: String
) {
    var id: Long? = null
}

厄介なのは、@ get:または@field:を使用しないと、コンストラクタパラメータに注釈が付けられることです。これはまだ有効なkotlinコードです(したがって、エラーは発生しません)。これらのユースケースでは役に立たないだけです。

6

IntelliJを使用してJavaをKotlinに変換する場合)、Spring Controllerメソッドの@Validアノテーションが変数ではなく最終的に型にアタッチされる可能性があります。これにより検証が失敗します。

たとえば、変換の結果、

@PostMapping
public Id create(@RequestBody someInfo: @Valid SomeInfo) {
    ...
}

これは検証されていません。 @Validは、次のような変数に移動する必要があります。

@PostMapping
public Id create(@RequestBody @Valid someInfo: SomeInfo) {
    ...
}
0
usr42