Я использую Валидатор Springs (Spring 5) для выполнения некоторых проверок полей некоторых моделей при публикации формы.При возникновении некоторых ошибок мы пытаемся выполнить перенаправление, включая модель и результаты привязки в качестве атрибутов flash.Но при попытке перенаправления возникает исключение, и оно очень странное.
Трассировка стека:
Java.lang.IllegalStateException: недопустимая цель для Validator [com.ma.maintenance.validate.ExamMarkScaleValidator @ 12e9281b]: org.springframework.validation.BeanPropertyBindingResult: 1 ошибки Ошибка поля в объекте 'examMarkScale' в поле 'examCode': отклоненное значение [];коды [field.required.examMarkScale.examCode, field.required.examCode, field.required.java.lang.String, field.required];аргументы [];сообщение по умолчанию [test] в org.springframework.validation.DataBinder.assertValidators (DataBinder.java:541) в org.springframework.validation.DataBinder.setValidator (DataBinder.java:530) в com.ma.maintenance.controller.ExamScaleController.initBinder (ExamScaleController.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
Но я не уверен, почему BeanPropertyBindingResult передается переопределенному методу поддержки? Реализация метода Поддерживаетследует комплекту вместе с Документацией и является правильным классом.
- Ive Уже пытался добавить BindingResults в качестве сигнатуры в методе GET, но та же проблема.
- И нет, я бы предпочел не использовать проверку бинов (JSR-303), потому что мы ожидаем, что у нас будет более сложная бизнес-логика, которая потребует немного больше усилий при выполнении проверки и мы хотим быть уверенными, что наш подход к проверкесогласован для всех сущностей.
Контроллер:
@Autowired
private CourseTypeService courseTypeService;
@Autowired
private ExamMarkScaleService examMarkScaleService;
static final Logger LOGGER =
LoggerFactory.getLogger(ExamScaleController.class);
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(new ExamMarkScaleValidator());
}
@RequestMapping(value = "/exam-mark-scale", method = RequestMethod.GET)
public String getExamMarkScaleForm(@ModelAttribute("examMarkScale")
ExamMarkScaleVO examMarkScale, final HttpServletRequest request, Model
model) {
String view = "/exam-mark/exam-mark-scale";
List<CourseType> courseTypes = courseTypeService.getAllCourseTypes();
model.addAttribute("courseTypeList", courseTypes);
model.addAttribute("perferredLanguages", Languages.values());
if (examMarkScale.getCourseTypeId() == null) {
final Long AFP_COURSE_CODE = 3508L;
examMarkScale.setCourseTypeId(AFP_COURSE_CODE);
}
return view;
}
@RequestMapping(value = "/submit-ExamMarkScale",method=RequestMethod.POST)
public String postExamMarkScaleForm(@Valid
@ModelAttribute("examMarkScale") ExamMarkScaleVO examMarkScale,
BindingResult bindingResults, RedirectAttributes redirectAttributes) {
try {
if (bindingResults.hasFieldErrors()) {
redirectAttributes.addFlashAttribute("examMarkScale",
examMarkScale);
redirectAttributes.addFlashAttribute("bindingResults",
bindingResults);
return "redirect:/exam-mark-scale";
} else {
examMarkScaleService.saveExamMarkScale(examMarkScale);
return "redirect:/exam-mark-scale";
}
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
return "errorpage";
}
Реализация валидатора:
@Override
public boolean supports(Class<?> clazz) {
return ExamMarkScaleVO.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "examCode",
"field.required", "test");
ValidationUtils.rejectIfEmpty(errors, "passMark", "field.required");
ValidationUtils.rejectIfEmpty(errors, "equivPassMark",
"field.required");
}