我目前正在从事 Sprig Boot(2) 反应式项目。所有 CRUD 端点和测试都工作正常。然后我决定在创建待办事项时添加验证,为此我向我的存储库类添加了注释:
@Data
@Container(containerName = "myContainer")
public class ToDo {
@Id
@PartitionKey
@GeneratedValue
private String id;
@NotBlank(message = "Category must not be blank")
private String category;
@NotNull(message = "Complete must not be null")
@AssertTrue(message = "Complete must be either true or false")
private boolean complete;
@NotBlank(message = "Name must not be blank")
private String name;
}
我在控制器方法中添加了 @Valid 注释来创建待办事项
@PostMapping
public Mono<ResponseEntity<ToDo>> createTodo(@Valid @RequestBody ToDo toDoItem) {
return toDoService.saveItem(toDoItem)
.flatMap(savedItem -> Mono.just(ResponseEntity.status(HttpStatus.CREATED).body(savedItem)))
.onErrorResume(DuplicateItemException.class, ex ->
Mono.just(ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ToDoDAO())));
}
这是相应的测试:
@Test
void createItem() {
ToDoDAO newItem = new ToDoDAO();
newItem.setName("New Item");
newItem.setCategory("Category");
newItem.setComplete(false);
createItem(newItem).expectStatus().isCreated();
}
问题:通过添加 @Valid 注释,此特定测试无法通过,返回错误的请求响应。如果我删除 @Valid 注释,测试将再次通过。任何建议都非常感激。
我期待返回状态代码 201,已创建。
问题与@Valid注释有关。我为解决该问题所做的就是删除注释并创建一个辅助类并在服务实现类中使用它。这种方法的性能更好,因为在访问数据库之前验证项目:
@Override
public Mono<ToDoDAO> saveItem(ToDoDAO toDoItem) {
todoValidator.validate(toDoItem);
return todoRepository.getItem(toDoItem.getId())
.flatMap(existingItem -> Mono.<ToDoDAO>error(new DuplicateItemException("Id " + toDoItem.getId() + " already exists in the database")))
.switchIfEmpty(todoRepository.save(toDoItem));
}