Pregunta

En uno de mis controladores tengo:

@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;
}

La lógica es simple:cuando el usuario navega a la página de búsqueda, realizo una búsqueda con criterios predeterminados y le devuelvo una lista (este es el resultado del cambio de requisitos, eh).

Encontré un problema en este código accidentalmente.Cuando los criterios de búsqueda predeterminados no son válidos, el comportamiento es:navegue hasta buscar -> complete los criterios de búsqueda con criterios no válidos -> llame a otro método (el segundo, con POST) -> realice la validación -> errors no están vacíos, así que regresa searchUsers vista.Pero el BindingResult bindingResult es en realidad sintético, del método anterior (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")).Entonces me salió un error No binding result is bound to session (Estoy de acuerdo con ésto).

No puedo tener @ModelAttribute y BindingResult Los parámetros (que están vinculados por Spring) se emparejan en el método GET para llamar a POST con ellos.

Entonces, ¿cuáles son las mejores soluciones para esto?

¿Fue útil?

Solución

Creo que puedes simplemente asociar tu new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria") con un nombre de atributo de modelo Spring apropiado, de esta manera:

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

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

Este es el comportamiento predeterminado de Spring MVC de vincular los resultados de validación de un atributo de modelo específico y debería ayudarlo a evitar el No binding result.. error

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top