Вы можете реализовать "org.springframework.validation.Validator" в соответствии с вашими моделями и проверкой, которую вы хотите выполнить. И вы можете использовать InitBinder в вашем контроллере для проверки объекта запроса. Ниже приведен пример, который я использовал один из моих проектов:
@Component(value = "fromToDateValidator")
public class FromToDateValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return (InventorySearchRequestByDate.class.equals(clazz) || OrderRequestDetails.class.equals(clazz));
}
@Override
public void validate(Object target, Errors errors) {
if (!errors.hasErrors()) {
Date fromDate = null;
Date toDate = null;
if (target instanceof InventorySearchRequestByDate) {
fromDate = ((InventorySearchRequestByDate) target).getFromDate();
toDate = ((InventorySearchRequestByDate) target).getToDate();
} else if (target instanceof OrderRequestDetails) {
fromDate = ((OrderRequestDetails) target).getFromDate();
toDate = ((OrderRequestDetails) target).getToDate();
}
if (fromDate.compareTo(toDate) > 0) {
errors.rejectValue("toDate", null, "To Date is prior to From Date");
}
}
}
}
Таким образом, поддерживается метод взятия параметра класса, который проверяет, применима ли проверка класса к модели. Как и в моем примере, я должен проверить объект запроса InventorySearchRequestByDate или объект запроса OrderRequestDetails, поэтому я выполнил проверку в соответствии с датой.
Теперь в методе validate содержится основная логика для проверки модели и добавления ошибок.
Вы можете привязать этот валидатор в вашем контроллере, как показано ниже, и использовать его:
@RestController
public class ItemInventoryController extends BaseController {
@Autowired
@Qualifier("fromToDateValidator")
private Validator fromToDateValidator;
@Autowired
private ItemInventoryService itemInventoryService;
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.addValidators(fromToDateValidator);
}
@RequestMapping(value = WebServiceEndPoints.INVENTORY_AVAILABILITY_BY_DATE, method = RequestMethod.POST)
public Map<String, Set<ItemDetails>> getAvailableItems(@RequestBody @Validated InventorySearchRequestByDate
inventorySearchRequestByDate, BindingResult bindingResult) throws InvalidFieldException {
validRequest(bindingResult);
return itemInventoryService.searchItemsByDateAvailablity(inventorySearchRequestByDate.getFromDate()
, inventorySearchRequestByDate.getToDate());
}
public void validRequest(BindingResult bindingResult) throws InvalidFieldException {
if (bindingResult.hasErrors()) {
throw new InvalidFieldException(bindingResult.getFieldErrors());
}
}
}
Таким образом, приведенный выше код проверяет модель и генерирует тело исключения в соответствии с вашими глобальными обработчиками.