2016-10-06 6 views
0

Ive überprüfte viele ähnliche Fragen, aber keine von ihnen hat eine funktionierende Lösung in meinem Fall.Dropdown-Menü im Frühjahr

Ich versuche, eine Dropdown-Auswahl für mein Benutzerregistrierungsformular mit Spring Form: Select-Tag. In meiner Bean wird Land als ManyToOne festgelegt, sodass ich eine Karte zur Auswahl des Werts übergebe.

Im Bouncing zwischen: Weder BindingResult noch einfaches Zielobjekt für den Bean-Namen 'register' als Request-Attribut verfügbar. Und: commandName nicht gefunden blabla ...

Helfen Sie mir zu verstehen, was los ist und wie es zu beheben ist. Es kann interessant sein zu wissen, dass ich meine Ansichten über ein MergedOutputModel (verwendet zwei Umleitungen zum Mounten der Ansicht), daher die Session-Variablen.

Code unten (vereinfacht, wo das Problem auftritt).

Controller-Klasse:

@Transactional 
@Controller 
public class RegisterController { 
@Autowired 
    public CountryDao cDao; 

    @RequestMapping("register") 
    public String register(Model model, @ModelAttribute("user") User user, BindingResult result, HttpSession session) { 
     session.setAttribute("user", user); 
     session.setAttribute("countryList", cDao.getCountryMap()); 
     return "login/registerForm"; 
    }} 

Ausblick:

<body> 
    <h1> 
     <spring:message code="register.message" /> 
    </h1> 
    [...] 
    <form:form action="addUser" commandName="register" method="post"> 

     [...] 
     <spring:message code="register.country" /> 
     <form:select path="country" items="${countryList}" /> 
     [...] 
     <input type="submit" value="<spring:message code='register.submit'/>" /> 
    </form:form> 
</body> 
+0

Zwei Dinge, die ich bemerken konnte, sind: @RequestMapping ("/ register", method = RequestMethod.POST) und öffentliche @ResponseBody String register() – HARDI

+0

Wo passt das? –

+0

@RequestMapping ("/ register", method = RequestMethod.POST) anstelle von @RequestMapping ("register") ..... public @ResponseBody String register (Modellmodell, @ModelAttribute ("user") Benutzer user, BindingResult Ergebnis , HttpSession-Sitzung) anstelle des öffentlichen String-Registers (Modellmodell, @ModelAttribute ("Benutzer") Benutzerbenutzer, BindingResult-Ergebnis, HttpSession-Sitzung). Auch noch eine Sache: Ist der Eingabeparameter Benutzer als JSON zu empfangen? – HARDI

Antwort

0

Dies kann erhalten Sie näher an, was Sie brauchen. Ihr Ablauf könnte geringfügig abweichen, sodass Sie die Seitennamen nach Bedarf anpassen können.

@Controller 
@SessionAttributes("countryList") //add whatever session attributes as needed 
public class RegisterController { 

    @RequestMapping("/registerForm", method = RequestMethod.GET) 
    public String registerGet(Model model) { 
     model.addAttribute("user", myUserService.createUser()); 
     model.addAttribute("countryList", countryDao.getCountryMap()); 
     return "login/registerForm"; 
    } 

    @RequestMapping("/registerVerify", method = RequestMethod.POST) 
    public String registerPost(@ModelAttribute("user") User user, 
           Errors result) { 

     if (result.hasErrors()) { 
      FormValidationLogger.log(log, result); 
      return "login/registerForm"; 
     } 
     //persist, send emails, or do whatever 
     return "registerVerify"; //or whatever page 
    } 

    @Autowired 
    private CountryDao countryDao; //put these at the bottom so we don't have to scroll as much to get to the meat of the code 

} 

ich nicht ohne weiteres die Notwendigkeit @Transactional im Code sehen Sie auf dem Laufenden. Ich würde das in Ihrer Service- oder DAO-Schicht erwarten.

<body> 
    <h1> 
     <spring:message code="register.message" /> 
    </h1> 
    [...] 
    <form:form modelAttribute="user" action="/registerVerify" method="post"> 

     [...] 
     <spring:message code="register.country" /> 
     <form:select path="country" items="${countryList}" /> 
     [...] 
     <input type="submit" value="<spring:message code='register.submit'/>" /> 
    </form:form> 
</body> 

Dies setzt voraus, dass country eine Eigenschaft von user ist. Vielleicht möchten Sie auch den Methodennamen in etwas wie getCountries() anstelle von getCountryMap() ändern.

+0

Ok, ich sehe hier einen netten Code nachbestellen. Ich werde es testen, aber es gibt noch einige Fragen, die bestehen bleiben. Wird das eine Weiterleitung überleben? Wenn ich die countrylist als Sitzungsattribut deklariere, wird es das Attribut verbinden, das in meiner Methode deklariert ist? Außerdem ist CountryMap ein ManyToOne-Attribut im Benutzer. Ich verwende eine Karte, um ein Dropdown zu erstellen, daher getCountryMap. Soll ich es nicht tun? –

+0

Jetzt wird ** org.apache.jasper.JasperException: org.apache.jasper.JasperException: java.lang.IllegalStateException: Weder BindingResult noch einfaches Zielobjekt für den Bean-Namen 'user' als Anforderungsattribut ** verfügbar. Sogar versucht, Benutzer als Sitzungsvariable hinzuzufügen. Mann, dieses Ding macht keinen Sinn für mich. –