Как проверить JSON @RequestBody с помощью org.springframework.validation.Validator в Spring WebFlux?

Я пытаюсь проверить JSON @RequestBody с помощью org.springframework.validation.Validator в Spring WebFlux, но получаю «Внутренняя ошибка сервера» со следующим сообщением.

java.lang.IllegalStateException: Failed to resolve argument 1 of type 'org.springframework.validation.BindingResult' on public reactor.core.publisher.Mono ....

Класс валидатора:

@Component
public class GreetingValidator implements Validator {

    @Override
    public boolean supports(Class<?> type) {
        return GreetingSchema.class.equals(type);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "content", "content.empty", "Content is required");
        GreetingSchema greeting = (GreetingSchema) obj;
    }

}

Класс контроллера REST:

@RestController
@RequestMapping("/greeting")
public class GreetingController {

    @Autowired
    private GreetingValidator validator;

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(validator);
    }

    @GetMapping
    public GreetingSchema get() {
        return new GreetingSchema("Hello, World!");
    }

    @PostMapping(consumes = "application/json")
    public Mono post(@Validated @RequestBody GreetingSchema body, BindingResult result) {
        if (result.hasErrors()) {
            return Mono.just(result.getFieldErrors());
        }
        return Mono.just("valid");
    }
}

Когда я попытался после удаления аннотации @RequestBody из метода публикации следующим образом

public Mono post(@Validated GreetingSchema body, BindingResult result)

то он работает без «Внутренней ошибки сервера», но не может проверить JSON @RequestBody.

{"content": "Hello, Xyz!"}

person Roshan Gade    schedule 05.02.2018    source источник
comment
Я использую Spring-Boot RC1.   -  person Roshan Gade    schedule 09.02.2018


Ответы (1)


Я не настраиваю WebDataBinder.
Мой код:
контроллер выглядит так

@PostMapping(value = "/url")
public Mono<Result> method(@RequestBody @Validated Message message) {
    long time1 = System.currentTimeMillis();
    //do sth
    long time2 = System.currentTimeMillis();
    return Mono.just(Result.withData(time2 - time1));
}

и сообщение класса выглядит следующим образом

@Getter
@Setter
public class Message implements Serializable {
    private String content;

    @Range(min = 1,max = 3)
    private int length;

    @NotNull
    private String publisher;
}
person Dont    schedule 15.11.2018