BindingResults не был успешно передан как флэш-атрибут при перенаправлении - PullRequest
0 голосов
/ 20 сентября 2019

Я использую Валидатор 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...