我正在尝试在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": ""
}'
将联系人重命名为故障单,但所有内容仍然相同。
答案 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)
}
. . .
}
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
类会抛出该错误