Значение @ModelAttribute недоступно в случае ошибки проверки - PullRequest
0 голосов
/ 13 марта 2020

Я довольно новичок в тимелисте и не слишком опытен в весне. В моем контроллере

@Controller
@RequestMapping("form")
@SessionAttributes(types = {Root.class /** another type here**/})
public class FormController extends BaseController {

    @ModelAttribute("errorMap")
    public Map<String,Integer> getErrorMap(Root root, BindingResult bindingResult) {
        Map<String,Integer> result = new HashMap<>();
        result.put("somevalue",5); // pretend there are 5 errors for somevalue.
        // some logic here processing bindingResult
    }

    @GetMapping
    public void show(@Valid Root root)
        // do nothing here, just show the page
    }

    ...
}


public class BaseController {

    @ExceptionHandler
    void handleBindException( BindException bindException, 
        Model model, HttpServletRequest request,
        HttpSession  session) throws Exception {
        model.addAllAttributes(bindException.getModel());
        addModelAttributes(model, request, true, session);
    }

    @ModelAttribute
    public final void addModelAttributes( Model model, HttpServletRequest request,
        boolean isException, HttpSession session) throws Exception {
        if(GET.matches(request.getMethod()) || isException)
            addModelAttributes(model);
        }
    }
}

В моей форме. html есть эта часть

<div th:if="${errorMap['somevalue']}>0" class="error"> <!-- marked line -->
    <sup th:text="${errorMap['somevalue']}" class="error"></sup>
</div>

Теперь, если нет ошибок проверки, все работает нормально, вызывается метод show(...) и отображается 5. Но если есть ошибка проверки, однако есть ошибка org.attoparser.ParseException: Exception evaluating SpringEL expression: "errorMap['somevalue']" (template: "form" - line 38, col 8), вызванная org.springframework.expression.spel.SpelEvaluationException: EL1012E: Cannot index into a null value в отмеченной строке.

Я ожидаю, что это будет работать, особенно в случае ошибок проверки. Что я здесь не так делаю или неправильно понимаю?

1 Ответ

0 голосов
/ 13 марта 2020

Простое, грязное быстрое исправление - добавить метод, который добавляет атрибут модели вручную:

protected void addErrorAttribute(Model model) {
    Root root = (Root)model.getAttribute("root");
    BindingResult bindingResult = (BindingResult)model.getAttribute("org.springframework.validation.BindingResult.root");
    model.addAttribute("errorMap", getErrorMap(root, bindingResult));
}

и вызвать этот метод из метода handleBindException(...).

...