Pregunta

Las disculpas si esta pregunta se ha hecho antes. Estoy esperando que alguien puede intervenir y ayudar a averiguar por qué mis errores de validación de formularios no aparecen.

Estoy utilizando Spring e Hibernate 3.0.3, y estoy usando la validación JSR-303 para validar mis entradas de formulario. Tengo un controlador de primavera que los mangos de conseguir una página que contiene un formulario que se crea con la ayuda de forma taglib de la primavera. De esta forma un usuario es capaz de cambiar su nombre y tenerlo guardado en la base de datos. Si alguna de la entrada está vacía, entonces la página con el formulario debe mostrarse de nuevo con mensajes de error. El mismo controlador se encarga de la presentación de la página. Parece que el controlador está funcionando correctamente en la mayoría de los aspectos, pero cuando hay un error en la forma presentada usuario, no hay errores se están presentando en la página.

Esto es lo que se parece a la forma:

<form:form commandName="changeNameCommand">
    <form:errors path="*" cssClass="errorBox" />

    <table width="100%" border="0" cellspacing="5" cellpadding="5" align="left">
      <tr>
    <td><b>First Name:</b></td>
    <td><form:input path="firstName" value="${user.firstName}" /></td>
  </tr>
  <tr>
    <td><b>Last Name:</b></td>
    <td> <form:input path="lastName" value="${user.lastName}" /></td>
  </tr>
</table>
</form:form>    

Tenga en cuenta que hay un objeto de usuario en la vista que se utiliza para rellenar el formulario con corriente el nombre y apellido del usuario. Esto está funcionando adecuadamente.

El controlador miradas algo como esto:

@Controller
@RequestMapping(value =  "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {

    @ModelAttribute("changeNameCommand")
    public ChangeNameCommand getCommand() {
        return new ChangeNameCommand();
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getChangeNamePage(HttpServletRequest req) {
    ModelAndView mav = new ModelAndView("Account.ChangeName");
        mav.addObject("page_title", "Change Name");

        return mav;
    }

    @RequestMapping(method = RequestMethod.POST)
    public String doChangeName(
                @ModelAttribute("changeNameCommand") 
                    @Valid ChangeNameCommand command, 
                    BindingResult result, SessionStatus status) {

        if (result.hasErrors()) {
            return "redirect:/account/settings/change-name"; 
        }

    // Code here to persist updated user first and last name to database...        

        status.setComplete();

        return "redirect:/home";
    }
}

Estoy usando Azulejos 2.1.2 a páginas de redacción y Urlrewrite 3.1.0 para URLs amigables ayudan a formar.

La apariencia de clase ChangeNameCommand algo como esto:

import org.hibernate.validator.constraints.NotEmpty;

public class ChangeNameCommand {

    @NotEmpty(message = "You must provide a first name.")
    private String firstName;

    @NotEmpty(message = "You must provide a last name.")
    private String lastName;

    @NotEmpty(message = "Your password is required to make changes.")
    private String currentPassword;

    // Getters and setters here...
}

Cuando se depura, veo que cuando no hay entrada para el primer o el último nombre de la instancia BindingResult contiene errores. Mi preocupación es la redirección cuando hay un error. He visto otras preguntas aquí que acaba de devolver el nombre de la vista en lugar de utilizar la redirección: prefijo. He intentado eso, pero (creo), debido a la forma en que estoy usando Urlrewrite y la forma en que mi correlación de servlet está configurado primavera devuelve un error. He intentado volver

/account/settings/change-name
/web/account/settings/change-name
/mywebsite/web/account/settings/change-name

pero en vano. Fwiw, aquí está mi servlet-mapping:

<servlet-mapping>
    <servlet-name>mywebsite</servlet-name>
    <url-pattern>/web/*</url-pattern>
</servlet-mapping>

Cualquier ayuda muy apreciada!

¿Fue útil?

Solución 2

Aquí es cómo resolví mi problema. Para empezar, yo no quiero dejar mi uso de UrlRewriteFilter y de los azulejos. Sin embargo, el problema con esto es que, en el caso de errores, simplemente no podía devolver la ruta, tal como se indica en la anotación controladores RequestMapping. A continuación se muestra mi solución, con la redirección eliminado en el caso de errores, en doChangeName().

@Controller
@RequestMapping(value =  "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {

    @ModelAttribute("changeNameCommand")
    public ChangeNameCommand getCommand() {        
        return new ChangeNameCommand();
    } 

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getChangeNamePage() {
        ModelAndView mav = new ModelAndView("Account.ChangeName");
        mav.addObject("page_title", "Change Name");

        return mav;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView doChangeName(@ModelAttribute("changeNameCommand") @Valid ChangeNameCommand command, 
            BindingResult result, SessionStatus status) {

        if (result.hasErrors
            ModelAndView mav = new ModelAndView("Account.ChangeName");
            mav.addObject("page_title", "Change Name");

            return mav;
         }

        // Code here to persist updated user first and last name to database...         

        status.setComplete();

        RedirectView view = new RedirectView("/home");
        return new ModelAndView(view);        
    }
}

Gracias a todos los que me ayudaron en esto!

Otros consejos

usando redirect hace que todos los atributos de la petición (incluyendo errores y todo el modelo) desaparecen. Por lo tanto, no utilice redirección, o utilizar la sesión para almacenar temporalmente los datos, o el uso de las conversaciones. O encontrar la manera de usar algo como un flash-scope (Estoy a punto en un tiempo)

Otra cosa - usando UrlRewriteFilter con la primavera-mvc está fuera de lugar. Usted tiene el control total sobre su ubicación era fenomenal RESTO-como las URL con la primavera-mvc solamente.

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