Добавить привязку для проверки - PullRequest
4 голосов
/ 29 марта 2019

Я хочу создать конечную точку Spring для проверки Java Object.Я попытался реализовать этот пример:

https://www.baeldung.com/validation-angularjs-spring-mvc

Я попробовал это:

public class WpfPaymentsDTO {

    @NotNull
    @Size(min = 4, max = 15)
    private String card_holder;

    private String card_number;
    ....
}

Конечная точка:

 @PostMapping(value = "/payment/{unique_transaction_id}", consumes = { MediaType.APPLICATION_JSON_VALUE }, produces = { MediaType.APPLICATION_JSON_VALUE })
      public ResponseEntity<StringResponseDTO> handleWpfMessage(@PathVariable("unique_transaction_id") String unique_transaction_id,
          @RequestBody WpfPaymentsDTO transaction, BindingResult result, HttpServletRequest request) throws Exception {

        if (result.hasErrors()) {
            List<String> errors = result.getAllErrors().stream()
              .map(DefaultMessageSourceResolvable::getDefaultMessage)
              .collect(Collectors.toList());
            return new ResponseEntity<>(errors, HttpStatus.OK);
        } 

        return ResponseEntity.ok(new StringResponseDTO("test"));
      }

Когда использование отправляетУгловая форма Я хотел бы проверить все поля.Но в настоящее время я получаю эту ошибку: Cannot infer type arguments for ResponseEntity<>

Как правильно это реализовать?

Ответы [ 2 ]

2 голосов
/ 31 марта 2019

Вам не хватает аннотации @Valid в подписи вашего метода.Если вы посмотрите на пример, который вы цитируете, то увидите, что он используется для объекта User.

Итак, в вашем случае:

@Valid @RequestBody WpfPaymentsDTO transaction

Также вы возвращаете два разных типа классов в ResponseEntity<T>

1) ResponseEntity<StringResponseDTO> inуспешный сценарий проверки

2) ResponseEntity<List<String>> в случае ошибки проверки

Приведенное выше описание является причиной:

Но в настоящее время я получаю эту ошибку: НевозможноАргументы типа логического вывода для ResponseEntity <>

Если вы посмотрите на пример, который вы цитируете, тип возвращаемого метода - ResponseEntity<Object>.

Поэтому ваш метод должен измениться на:

  @PostMapping(value = "/payment/{unique_transaction_id}", 
     consumes = { MediaType.APPLICATION_JSON_VALUE }, 
     produces = { MediaType.APPLICATION_JSON_VALUE })
  public ResponseEntity<Object> handleWpfMessage(
                 @PathVariable("unique_transaction_id") String unique_transaction_id,
                 @Valid @RequestBody WpfPaymentsDTO transaction, 
                 BindingResult result, 
                 HttpServletRequest request) throws Exception {

Обновление:

Есть ли способ узнать, для какой переменной возникает ошибка проверки?

Да, вы можете получить все поляОшибки привязки, такие как:

List<FieldError> errors = bindingResult.getFieldErrors();
for (FieldError error : errors ) {
    System.out.println ("Validation error in field: " + error.getField() 
                    + "! Validation error message: " + error.getDefaultMessage() 
                    + "! Rejected value:" + error.getRejectedValue());
}
1 голос
/ 29 марта 2019

попробуйте использовать угловые реактивные формы (FormGroup и FormControl). Я думаю, что так проще.

...