Java Bean验证不适用于SpringWebFlux

Java Bean验证不适用于SpringWebFlux,java,validation,spring-boot,spring-webflux,reactive,Java,Validation,Spring Boot,Spring Webflux,Reactive,我已经重构了我的代码以使用SpringWebFlux,但现在@Valid停止工作。 它不是在验证请求主体 @PostMapping(value = "/getContactInfo",produces = "application/json",consumes = "application/json") public Flux<UserContactsModel> getUserContacts(@Valid @RequestBody Mono<LoginModel> l

我已经重构了我的代码以使用SpringWebFlux,但现在
@Valid
停止工作。 它不是在验证请求主体

@PostMapping(value = "/getContactInfo",produces = "application/json",consumes = "application/json")
public Flux<UserContactsModel> getUserContacts(@Valid @RequestBody Mono<LoginModel> loginDetail) {

    loginDetail.log();
    return contactInfoService
        .getUserContacts(loginDetailApiMapper.loginModelMonoToLoginBoMono(loginDetail))
        .flatMapIterable(
            userContactsBO -> contactInfoMapper.userContactBoToModelList(userContactsBO));
}
更新1: 在像这样更改代码并在类级别添加@Validated之后

@RestController
@Validated
public class ContactInfoController implements ContactInfoApi {
public Flux<UserContactsModel> getUserContacts(@RequestBody  Mono<@Valid  LoginModel> loginDetail) {
@RestController
@验证
公共类ContactInfoController实现ContactInfoApi{
公共流量getUserContacts(@RequestBody Mono loginDetail){

我正在获取javax.validation.ConstraintDeclarationException:HV000197:找不到reactor.core.publisher.Mono类型的类型参数“T”的值提取器。

@Valid annotation验证对象。因此,如果您试图验证Mono,则需要更改为LoginModel对象,例如:

  ..getUserContacts(@RequestBody Mono<@Valid LoginModel> loginDetail) {
      ...
  }
.getUserContacts(@RequestBody Mono loginDetail){
...
}

对我来说什么都不管用。所以我使用javax.validator手动验证了它

@Autowired private Validator validator;

 public Flux<UserContactsModel> getUserContacts(@RequestBody Mono<@Valid LoginModel> loginDetail) {

    return loginDetail
        .filter(this::validate)
        .map(....);
}

 private boolean validate(LoginModel loginModel) {

    Set<ConstraintViolation<LoginModel>> constraintViolations = validator.validate(loginModel);

    if (CollectionUtils.isNotEmpty(constraintViolations)) {
      StringJoiner stringJoiner = new StringJoiner(" ");
      constraintViolations.forEach(
          loginModelConstraintViolation ->
              stringJoiner
                  .add(loginModelConstraintViolation.getPropertyPath().toString())
                  .add(":")
                  .add(loginModelConstraintViolation.getMessage()));
      throw new RuntimeException(stringJoiner.toString());
    }

    return true;
  }
@Autowired-private-Validator-Validator;
公共流量getUserContacts(@RequestBody Mono loginDetail){
返回登录详细信息
.filter(此::验证)
.地图(……);
}
专用布尔验证(LoginModel LoginModel){
设置constraintViolations=validator.validate(loginModel);
if(CollectionUtils.isNotEmpty(constraintViolations)){
细木工细木工=新细木工(“”);
约束条件(
loginModelConstraintViolation->
细木工
.add(loginModelConstraintViolation.getPropertyPath().toString())
.add(“:”)
.add(loginmodelsconstraintviolation.getMessage());
抛出新的RuntimeException(stringJoiner.toString());
}
返回true;
}

我也试过了,但没有成功。我还需要其他东西吗?你能发布LoginModel类吗?你使用的是自定义验证器吗?编辑。添加了登录模型。javax.validation.ConstraintDeclarationException:HV000197:没有为reactor.core.publisher.Mono类型的类型参数“t”找到值提取器。现在获取此信息我在之后获取此信息在类级别添加@Validated,否则不会发生验证,我得到了200个与以前一样的OK响应(不是更好吗?:)
@Autowired private Validator validator;

 public Flux<UserContactsModel> getUserContacts(@RequestBody Mono<@Valid LoginModel> loginDetail) {

    return loginDetail
        .filter(this::validate)
        .map(....);
}

 private boolean validate(LoginModel loginModel) {

    Set<ConstraintViolation<LoginModel>> constraintViolations = validator.validate(loginModel);

    if (CollectionUtils.isNotEmpty(constraintViolations)) {
      StringJoiner stringJoiner = new StringJoiner(" ");
      constraintViolations.forEach(
          loginModelConstraintViolation ->
              stringJoiner
                  .add(loginModelConstraintViolation.getPropertyPath().toString())
                  .add(":")
                  .add(loginModelConstraintViolation.getMessage()));
      throw new RuntimeException(stringJoiner.toString());
    }

    return true;
  }