programing

코틀린 및 @유효한 스프링 주석

batch 2023. 7. 30. 17:30
반응형

코틀린 및 @유효한 스프링 주석

엔티티가 있습니다.

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
    }

말을 덜 할 수 있는 좋은 방법이 있습니까?

감사해요.

스프링이 필드에 적용하려면 이러한 주석이 필요한 것 같습니다.그러나 Kotlin은 이러한 주석을 생성자 매개 변수에 적용합니다. 사용field:필드에 적용할 주석을 적용할 때 지정자입니다.다음 코드가 당신에게 잘 작동할 것입니다.

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

마이클의 대답에 대한 대안으로 게터에 주석을 다는 것도 효과가 있습니다.

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

짜증나는 부분은 @get: 또는 @field:를 사용하지 않으면 생성자 매개 변수에 주석이 추가된다는 것입니다.이것은 여전히 유효한 코틀린 코드이므로 오류가 발생하지 않습니다.이러한 사용 사례에서는 무용지물입니다.

만약 당신이 IntelliJ를 사용하여 Java를 Kotlin으로 변환한다면,@Valid스프링 컨트롤러 방법의 주석은 결국 변수 대신 형식에 부착될 수 있습니다.이렇게 하면 유효성 검사가 중단됩니다.

예를 들어, 변환은 다음과 같은 결과를 초래할 수 있습니다.

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

유효성을 검사하고 있지 않습니다.@Valid다음과 같은 변수로 이동해야 합니다.

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

또한 휴식 컨트롤러는 다음과 같이 표시되어야 합니다.@Validated주석

원시 요소의 함수 유효성 검사:

@Validated
class MyClass() {
    fun myFun(@Valid @NotEmpty @Size(min = 3, max = 30) name: String) {
  }
}

이메일 주소를 확인하는 경우 다음과 같이 작성할 수 있습니다.

import javax.validation.constraints.Email
import javax.validation.constraints.Size

data class User(
    val id: Long,
    @field:Size(min = 2)
    val firstName: String,
    @field:Size(min = 2)
    val lastName: String,
    @field:Email
    val email: String,
   ..)

언급URL : https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation

반응형