我如何使用WebFlux返回Springboot 3.0的自定义验证错误?
我已经接通了下面的控制器
import jakarta.validation.Valid;
//...
@Validated
@RestController
@RequestMapping("/organizations")
@RequiredArgsConstructor
public class OrganizationController {
private final OrganizationService organizationService;
@PostMapping("/create")
public Mono<ResponseEntity<Organization>> create(@Valid @RequestBody final OrganizationDto organizationDto) {
return organizationService.create(organizationDto).map(ResponseEntity::ok);
}
}
OrganizationDto
已设置为:
import jakarta.validation.constraints.NotNull;
//...
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public final class OrganizationDto {
@NotNull
private String name;
//...
}
最后我得到了我认为正确的ValidationHandler/ErrorController
@Slf4j
@ControllerAdvice
@RequiredArgsConstructor
public class ErrorController {
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleValidationExceptions(final MethodArgumentNotValidException ex) {
final BindingResult bindingResult = ex.getBindingResult();
final List<FieldError> fieldErrors = bindingResult.getFieldErrors();
final Map<String, String> errors = new HashMap<>();
fieldErrors.forEach(error -> errors.put(error.getField(), error.getDefaultMessage()));
return errors;
}
}
但是,如果我将有效负载发送到的控制器中的端点
{
"name": null
}
我回来了
{
"timestamp": 1677430410704,
"path": "/organizations/create",
"status": 400,
"error": "Bad Request",
"requestId": "2050221b-2"
}
这几乎就是我想要的,但是我尝试将验证失败的原因放入响应中,但是没有任何运气
我已经在handleValidationExceptions
上设置了断点,但看起来我永远不会进入它,而且我也没有在服务器端日志中看到任何指向正在发生的事情的东西。
我的类路径上确实有org.springframework.boot:spring-boot-starter-validation
,而且我使用的是最新的Springboot 3.0.3
我是否遗漏了某个步骤或注解?
1条答案
按热度按时间q3aa05251#
我能够通过删除
ErrorController
并返回到我以前尝试过的方法来解决这个问题,即编写WebExceptionHandler
的自定义实现这里需要注意的重要一点是,必须设置
@Order
值,否则将跳过此实现,并且永远不会调用它(这正是我最初忽略此解决方案的原因)。我的
WebExceptionHandler
版本这将正确返回以下响应:
在传递问题中使用的请求时。
注意:如果有人使用此选项,请小心使用
@SneakyThrows