Невозможно сделать это без изучения каждого из элементов. То, что вы действительно хотите знать, «кто-то еще уже написал метод, который преобразует форму в объект 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;
}
Да, это выполнимо & amp; весна очень хорошо поддерживает его. Вам просто не хватает некоторой конфигурации, чтобы включить ее весной.
blockquote>
- Использовать примечание 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, поскольку они выдаются до проверки привязки в жизненном цикле запроса.
Вы должны поместить это на свой обработчик.
@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;
}
@NotEmpty
в моем контроллере?
– Gerep
13 July 2018 в 19:39