簡體   English   中英

Spring webflux bean 驗證不起作用

[英]Spring webflux bean validation not working

我正在嘗試在 Webflux 中使用 bean 驗證。 這是我到目前為止:

@PostMapping("contact")
fun create(@RequestBody @Valid contact: Mono<Contact>) : Mono<Contact> {
    return contact.flatMap { contactRepository.save(it) }
            .doOnError{ Error("test") }
}

驗證不起作用......我希望Error("test")會被顯示......

有人有工作示例(Java 或 Kotlin)嗎?

更新

這是一個可以復制的存儲庫: https : //github.com/jwz104/webflux-validation-test

要求:

curl --request POST \
  --url http://localhost:8080/tickets \
  --header 'content-type: application/json' \
  --data '{
    "email": "",
    "name": "",
    "message": ""
}'

將聯系人重命名為票證,但一切仍然相同。

您在示例項目中放置的注釋實際上是對Ticket類的構造函數參數的注釋。 對於 Spring 驗證,您需要對字段進行注釋。 您可以在 Kotlin 中使用注解 use-site targets來做到這一點。

在這種特定情況下,您的 Ticket 類應如下所示:

data class Ticket(
        @field:Id
        @field:JsonSerialize(using = ToStringSerializer::class)
        val id: ObjectId = ObjectId.get(),

        @field:Email
        @field:Max(200)
        @field:NotEmpty
        val email: String,

        @field:NotEmpty
        @field:Size(min = 2, max = 200)
        val name: String,

        @field:NotEmpty
        @field:Size(min = 10, max = 2000)
        val message: String
)

這與以下控制器功能一起將按預期工作並返回錯誤:

@PostMapping("tickets")
fun create(@RequestBody @Valid contact: Mono<Ticket>) : Mono<Ticket> {
    return contact.flatMap { ticketRepository.save(it) }
            .doOnError{ Error("test") }
}

我不得不結合 SO 中的幾個答案才能得到正確的驗證。 我所做的是:

  • 按照此處的建議制作我的數據類。

    • 然后我使用javax.validation.Validator類來驗證數據類。

import javax.validation.Validator import javax.validation.ConstraintViolationException

@Service
open class MyService {
    @Autowired
    lateinit var repository: UserRepository

    @Autowired
    lateinit var validator: Validator

     open fun createUser(user: User): Mono<User> {
         val violations = validator.validate(user)
          //if it violates our constraints, it will throw an exception, which we 
          //handle using global exception handler
          if(violations.isNotEmpty()){
               throw ConstraintViolationException(violations)
           }
           return repo.save(user)
         }
. . .
}
  • 在 application.properties 中添加這些行。
 spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false

並捕獲異常。

@RestControllerAdvice    
open class ExceptionHandlers {

  @ExceptionHandler(ConstraintViolationException::class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  fun throwConstraintViolationExcetion(ex: ConstraintViolationException): ApiResponse {
    return ApiResponse (message= ex.message.toString(), data= null);
  }
}

ps ApiResponse只是一個以服務器消息和數據為參數的數據類。 無需處理@Controller錯誤,因為它會被@Service類拋出

您還需要添加bindingResult: BindingResult作為額外參數。 當方法開始時,您可以執行諸如bindingResult.isValid() 我們在所有控制器方法上使用一個方面來向用戶返回帶有驗證錯誤的錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM