Отправить оставшийся ответ вместо HTML-страницы, когда javax.validation.constraints.* не выполняется

Я создаю службу Spring REST, и у меня есть несколько конечных точек, которые принимают полезную нагрузку запроса с помощью метода POST. Я включил спецификацию JSR 303 в свой проект, и она отлично работает для проверки. Теперь, как мне заставить мое приложение отправлять ответ JSON вместе с другим кодом состояния. В настоящее время приложение выдает 400 со страницей ошибки tomcat.

Ошибка приложения

Обновлять:

Я понял, что мне нужно включить BindingResult в свой метод и, следовательно, я могу извлечь оттуда ошибки.

@PostMapping(value = "/validateBankInformation", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
protected ResponseEntity<BusinessSolutionVO> validateBankInformation(@Valid @RequestBody BankInformation bankInformation, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        List<ObjectError> errors = bindingResult.getAllErrors();
        for (ObjectError error : errors) {
            System.out.println(error.getDefaultMessage());
        }
    }
}

person Rohit    schedule 19.10.2017    source источник
comment
Что вы сделали до сих пор?   -  person delephin    schedule 19.10.2017


Ответы (2)


Правильно ли аннотирован ваш класс сущности?

Вы должны определить UniqueConstraints внутри аннотации @Table.

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "username" }),
    @UniqueConstraint(columnNames = { "email" }), @UniqueConstraint(columnNames = { "field1", "field2" }) })
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Email
    @NotNull
    private String email;

    @NotNull
    @Size(min = 4, max = 24)
    private String username;

    @NotNull
    private String password;

    @NotNull
    private String field1;

    @NotNull
    private String field2;

    // Getters
    // Setters
    // Other Methods

}
person Dzinot    schedule 21.10.2017

Есть разные способы решить эту проблему. Но самый простой способ для этого случая — вернуть ответ об ошибке http, как показано ниже:

@PostMapping(value = "/validateBankInformation", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
protected ResponseEntity<BusinessSolutionVO> validateBankInformation(@Valid @RequestBody BankInformation bankInformation, BindingResult bindingResult) {

    if (bindingResult.hasFieldErrors()) {
           String errors = bindingResult.getFieldErrors().stream()
                    .map(p -> p.getDefaultMessage()).collect(Collectors.joining("\n"));            
                //throw new InvalidRequestParameterException("Bad Request", errors);

           return ResponseEntity.badRequest().body(errors);
     }

     return ResponseEntity.ok("Successful");
}

Или вы можете создавать собственные сообщения об исключениях и выдавать их.

person Olantobi    schedule 21.10.2017