Spring webflux bean验证不起作用

时间:2018-01-25 09:51:46

标签: java spring kotlin bean-validation spring-webflux

我正在尝试在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": ""
}'

将联系人重命名为故障单,但所有内容仍然相同。

3 个答案:

答案 0 :(得分:5)

您在示例项目中放置的注释实际上是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 ) 类的构造函数参数的注释。对于Spring验证,您需要注释字段。您可以使用annotation use-site targets在Kotlin中执行此操作。

在这种特定情况下,您的Ticket类应如下所示:

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

这与以下控制器功能一起工作并按预期返回错误:

class MyModel(models.Model):
    logo = CloudinaryField('Logo', blank=True, null=True)

答案 1 :(得分:1)

您还需要将myColumn.setCellFactory(factory -> new TreeTableCell<MyModel, String>(){ @Override protected void updateItem(String item, boolean empty) { super.updateItem(item, empty); if(empty){ setText(null); setGraphic(null); return; } // if empty is false, then these references should not be null MyModel myModel = getTreeTableRow().getItem(); TreeItem<MyModel> treeItem = getTreeTableRow().getTreeItem(); } }); 添加为额外参数。当方法开始时,您可以执行bindingResult: BindingResult之类的操作。我们使用所有控制器方法的一个方面来向用户返回带有验证错误的错误消息。

答案 2 :(得分:0)

我必须结合SO的一些答案才能正确进行验证。 我所做的是:

  • 使我的数据类符合建议的here

    • 然后我使用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);
  }
}

p.s ApiResponse只是一个以服务器消息和数据为参数的数据类。 无需处理@Controller类中的错误,因为@Service类会抛出该错误