2010-09-16 13 views
4

Je fais la chose de contrôleur basé sur l'annotation de printemps 3. Le problème est, quand il échoue la validation, les données de référence sont perdues, à savoir les trucs countryDivisions. Je ne l'ai pas mis dans le formulaire parce que ses données ne sont pas éditables par l'utilisateur, et l'orthodoxie ici est que seules les données modifiables par l'utilisateur vont dans le formulaire. Ai-je d'autres choix?les données de référence sont perdues lorsque le formulaire échoue la validation dans le contrôleur basé sur des annotations spring3

@Controller 
public class MyInfoController { 

    @Autowired 
    private MyInfoFormValidator validator; 

private void loadReferenceData(ModelMap model) { 
     model.put("countryDivisions",countryDivisionService.getCountryDivisionOrderedByCode()); 
    } 

    @ModelAttribute 
    private MyInfoForm loadMyInfo() { 
     MyInfoForm form = new MyInfoForm(); 
    //load it up 
    return form; 
    } 


    @RequestMapping(value="/editMyInfo", method = RequestMethod.GET) 
    public String editMyInfo(ModelMap model) { 
     loadReferenceData(model); 
     return "contactEdit"; 
    } 

    @RequestMapping(value="/editMyInfo", method = RequestMethod.POST) 
    public String saveMyInfo(ModelMap model, MyInfoForm form,BindingResult result) { 
     validator.validate (form,result); 
     if (result.hasErrors()) { 
      model.put("commandName", "myInfoForm"); 
      return "contactEdit"; 
     } 
     //save some stuff 
     return "redirect:viewMyInfo"; 
    } 

} 

Répondre

9

Vous devez fournir des données de référence comme vos CountryDivisions avec l'aide de l'@ModelAttribute d'annotation. Cela a le grand avantage que vous n'avez pas besoin de vous répéter encore et encore et de fournir les mêmes données dans plusieurs méthodes.

Pour votre exemple, je fourniraient quelque chose comme ceci:

@ModelAttribute("countryDivisions") 
public List<CountryDivision> populateCountryDivisions() { 
    return countryDivisionService.getCountryDivisionOrderedByCode(); 
} 

Cela donne votre point de vue d'accéder à un attribut de modèle appelé « countryDivisions » qui contient une liste de « CountryDivison » -Objets fourni par la méthode de service de votre "paysDivisionService".

+0

Merci! Ça a du sens. Pour une raison quelconque, il ne m'est pas venu à l'esprit d'avoir plus d'une méthode annotée à @ModelAttribute – nont

+0

Vous êtes les bienvenus! Il est tout à fait correct d'avoir plusieurs méthodes annotées avec @ModelAttribute dans un seul contrôleur. – stefanglase

1

Pourquoi ne pas faire juste

if (result.hasErrors()) { 
     model.put("commandName", "myInfoForm"); 
     loadReferenceData(model); 
     return "contactEdit"; 
    } 
+0

car maintenant vous le chargez deux fois, quand il devrait être sauvegardé dans la session. – nont