Domanda

Mi scuso se questa domanda è stato chiesto prima. Sto sperando che qualcuno possa intervenire e aiutarmi a capire il motivo per cui i miei errori di validazione dei form non vengono visualizzati.

Sto usando primavera 3.0.3 e Hibernate, e sto usando la convalida JSR-303 per convalidare i miei input del form. Ho un regolatore di primavera che le maniglie ottenere una pagina che contiene un modulo che si crea con l'aiuto di modulo taglib di primavera. In questa forma di un utente è in grado di cambiare il loro nome e lo hanno salvato nel database. Se uno qualsiasi degli input è vuota, allora la pagina con il modulo dovrebbe essere visualizzato di nuovo con i messaggi di errore. Lo stesso controller gestisce presentazione della pagina. Sembra che il controller funzioni correttamente sotto molti aspetti, ma quando c'è un errore nella forma inseriti dall'utente, senza errori vengono visualizzati nella pagina.

Ecco quale forma appare come segue:

<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>    

Si noti che v'è un oggetto utente nella vista che viene utilizzato per popolare il modulo con l'attuale nome e cognome dell'utente. Questo funziona correttamente.

L'aspetto del controller qualcosa di simile:

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

Tiles 2.1.2 per pagine di composizione e URLRewrite 3.1.0 per contribuire a formare gli URL amichevoli.

L'aspetto di classe ChangeNameCommand qualcosa di simile:

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...
}

Quando il debug, vedo che quando non c'è ingresso per il primo o il cognome l'istanza BindingResult contiene errori. La mia preoccupazione è il reindirizzamento quando si verifica un errore. Ho visto altre domande qui che solo restituisce il nome della vista invece di utilizzare il redirect: prefisso. Ci ho provato, ma (credo) a causa del modo in cui sto usando URLRewrite e il modo in cui la mia mappatura servlet è impostato primavera restituisce un errore. Ho provato a tornare

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

, ma senza alcun risultato. FWIW, ecco la mia servlet-mapping:

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

Qualsiasi aiuto molto apprezzato!

È stato utile?

Soluzione 2

Ecco come ho risolto il mio problema. Per cominciare con, non volevo far cadere il mio uso di URLRewriteFilter e tegole. Tuttavia, il problema di questo è che, in caso di errori, non potevo restituire il percorso, come indicato nella nota controllori RequestMapping. Qui di seguito è la mia soluzione, con il reindirizzamento rimosso in caso di errori, in 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);        
    }
}

Grazie a tutti coloro che mi hanno aiutato fuori su questo!

Altri suggerimenti

utilizzando redirect rende tutti gli attributi di richiesta (compresi gli errori e l'intero modello) scompaiono. Quindi, non utilizzare reindirizzamento, o utilizzare la sessione per memorizzare temporaneamente i dati, o utilizzare le conversazioni. Oppure capire come usare qualcosa come un flash-scope (che sto per in un po ')

Un'altra cosa - usando UrlRewriteFilter con molla-MVC è fuori luogo. Hai il pieno controllo della tua beatuful REST-come gli URL con la primavera-MVC solo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top