Spring Boot как вернуть мои собственные сообщения об ошибках ограничения проверки

Невозможно сделать это без изучения каждого из элементов. То, что вы действительно хотите знать, «кто-то еще уже написал метод, который преобразует форму в объект JSON?» Что-то вроде следующего должно работать - обратите внимание, что он даст вам только элементы формы, которые будут возвращены через POST (должно иметь имя). Это не проверено.

function formToJSON( selector )
{
     var form = {};
     $(selector).find(':input[name]:enabled').each( function() {
         var self = $(this);
         var name = self.attr('name');
         if (form[name]) {
            form[name] = form[name] + ',' + self.val();
         }
         else {
            form[name] = self.val();
         }
     });

     return form;
}
0
задан Gerep 13 July 2018 в 19:45
поделиться

2 ответа

Да, это выполнимо & amp; весна очень хорошо поддерживает его. Вам просто не хватает некоторой конфигурации, чтобы включить ее весной.

  • Использовать примечание Spring @Validated, чтобы включить весну для проверки контроллера
  • Ручка ConstraintViolationException в вашем ControllerAdvice, чтобы поймать все неудачные сообщения проверки.
  • Пометить required=false в @RequestParam, чтобы он не выдавал MissingServletRequestParameterException и скорее перешел к следующему шагу проверки ограничений.
@ControllerAdvice
public class CustomResponseEntityExceptionHandler {

    @ExceptionHandler
  public ResponseEntity<ApiError> handle(ConstraintViolationException exception) {
        //you will get all javax failed validation, can be more than one
        //so you can return the set of error messages or just the first message
        String errorMessage = new ArrayList<>(exception.getConstraintViolations()).get(0).getMessage();
       ApiError apiError = new ApiError(errorMessage, errorMessage, 1000);    
       return new ResponseEntity<ApiError>(apiError, null, HttpStatus.BAD_REQUEST);
  }
}



@RestController
@Validated
public class MinimumStockController {

    @RequestMapping(value = "/minimumstock")
    public Product product(
            @RequestParam(value = "product.sku", required=false) @NotEmpty(message = "Product.sku cannot be empty") String sku,
            @RequestParam(value = "stock.branch.id", required=false) String branchID) {
        return null;
    }
}

ПРИМЕЧАНИЕ. MissingServletRequestParameterException не будет иметь доступа к сообщениям проверки javax, поскольку они выдаются до проверки привязки в жизненном цикле запроса.

2
ответ дан Amith Kumar 17 August 2018 в 12:11
поделиться

Вы должны поместить это на свой обработчик.

@ControllerAdvice
public class CustomResponseEntityExceptionHandler {

    @ExceptionHandler(value = { MissingServletRequestParameterException.class })
    public ResponseEntity<ApiError> handleConflict(MissingServletRequestParameterException ex, WebRequest request) {
        String message = ex.getParameterName() + " cannot be empty";
        ApiError apiError = new ApiError(ex.getMessage(), message, 1000);
        return new ResponseEntity < ApiError > (apiError, null, HttpStatus.BAD_REQUEST);
    }
}

UPDATE

Я не знаю, как вы можете получить сообщение по умолчанию, но в качестве обходного пути вы можете сделать подтверждение на вашем контроллере и выброс пользовательского исключения, если параметр пуст, а затем обработать в CustomResponseEntityExceptionHandler.

Что-то вроде следующего:

Установите required=false

@RequestMapping(value = "/minimumstock")
public Product product(@RequestParam(required = false) String sku, @RequestParam(value = "stock.branch.id") String branchID) {
    if (StringUtils.isEmpty(sku)) 
        throw YourException("Product.sku cannot be empty");

    return null;
}
0
ответ дан Matheus Cirillo 17 August 2018 в 12:11
поделиться
  • 1
    Но есть ли способ получить сообщение от аннотации @NotEmpty в моем контроллере? – Gerep 13 July 2018 в 19:39
  • 2
    @Gerep Я не знаю, можете ли вы это сделать, но я обновил свой ответ обходным путем. Надеюсь это поможет. – Matheus Cirillo 13 July 2018 в 20:07
Другие вопросы по тегам:

Похожие вопросы: