Проверка бина не работает для весеннего webflux - PullRequest
0 голосов
/ 21 декабря 2018

Я реорганизовал свой код для использования Spring Webflux, но теперь @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));
}

Я получаю 200 OK вместо плохого запроса, который я возвращаю из рекомендации контроллера.

Редактировать 1:

   import javax.validation.constraints.NotNull;
   import javax.validation.constraints.Pattern;

    public class LoginModel implements Serializable {

      private String clientId;

      @Pattern(regexp = "^[a-zA-Z0-9]*$", message = "Login ID is invalid")
      @NotNull
      private String loginId;
    }

обновление 1: После изменения кода, подобного этому, и добавления @Validated на уровне класса

@RestController
@Validated
public class ContactInfoController implements ContactInfoApi {
public Flux<UserContactsModel> getUserContacts(@RequestBody  Mono<@Valid  LoginModel> loginDetail) {

Я получаю javax.validation.ConstraintDeclarationException:HV000197: Не найден экстрактор значения для параметра типа 'T' типа реактор.core.publisher.Mono.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

У меня ничего не получалось.Поэтому я проверил это вручную с помощью 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;
  }
0 голосов
/ 21 декабря 2018

@ Допустимая аннотация подтверждает объект.Итак, вы пытаетесь проверить Mono, вам нужно изменить объект LoginModel, например:

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