Pergunta

Em um dos meus controladores eu tenho:

@RequestMapping(value = "search", method = RequestMethod.GET)
public ModelAndView searchUsers(HttpSession session, HttpServletRequest request) {
    UiUserSearchCriteria userSearchCriteria = (UiUserSearchCriteria) session
            .getAttribute("UsersController_userSearchCriteria");

    if (null == userSearchCriteria) {
        userSearchCriteria= defaultUserSearchCriteria;
    }

    // Here be dragons
    return searchUsers(userSearchCriteria, new BeanPropertyBindingResult(userSearchCriteria,
            "userSearchCriteria"), session, request);
}

@RequestMapping(value = "search", method = RequestMethod.POST)
public ModelAndView searchUsers(
        @ModelAttribute("userSearchCriteria") UiUserSearchCriteria userSearchCriteria,
        BindingResult bindingResult, HttpSession session, HttpServletRequest request) {

    userSearchCriteriaValidator.validate(userSearchCriteria, bindingResult);
    if (bindingResult.hasErrors()) {
        // Here be dragons
        return new ModelAndView("searchUsers");
    }

    ModelAndView result = new ModelAndView("redirect:listUsers");
    PagedListHolder<UiUser> userList = new PagedListHolder<UiUser>(
            usersService.searchUsers(userSearchCriteria));

    userList.setPageSize(10);
    userList.setSort(defaultSort);
    userList.resort();
    session.setAttribute("UsersController_userList", userList);
    session.setAttribute("UsersController_userSearchCriteria", userSearchCriteria);

    return result;
}

A lógica é simples:quando o usuário navega para a página de pesquisa, eu realmente realizo uma pesquisa com critérios padrão e retorno uma lista (isso é o resultado da mudança de requisitos, hein).

Encontrei um problema neste código, acidentalmente.Quando os critérios de pesquisa padrão não são válidos, o comportamento é:navegue até pesquisar -> preencha os critérios de pesquisa com critérios inválidos -> chame outro método (o segundo, com POST) -> execute a validação -> errors não estão vazios, então retorne searchUsers visualizar.Mas o BindingResult bindingResult é na verdade sintético, do método anterior (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")).Então eu recebi um erro No binding result is bound to session (Eu concordo com isto).

Eu não posso ter @ModelAttribute e BindingResult parâmetros (que são vinculados pelo Spring) emparelham no método GET para chamar POST com eles.

Então, quais são as melhores soluções para isso?

Foi útil?

Solução

Eu acho que você pode simplesmente associar seu new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria") com um nome de atributo de modelo Spring apropriado, desta forma:

  BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")

model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);

Este é o comportamento padrão do Spring MVC de vincular os resultados da validação de um atributo de modelo específico e deve ajudá-lo a evitar o No binding result.. erro

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top