2010-04-15 2 views
4

J'ai une classe qui modélise un utilisateur et une autre qui modélise son pays. Quelque chose comme ceci:Définition de l'objet imbriqué à null lorsque l'option sélectionnée a une valeur vide

public class User{ 
    private Country country; 
    //other attributes and getter/setters 
} 

public class Country{ 
    private Integer id; 
    private String name; 
    //other attributes and getter/setters 
} 

J'ai une forme de printemps où j'ai un combobox afin que l'utilisateur peut sélectionner son pays ou peut sélectionner l'option définie pour indiquer qu'il doen't veulent fournir ces informations. J'ai donc quelque chose comme ceci:

<form:select path="country"> 
    <form:option value="">-Select one-</form:option> 
    <form:options items="${countries}" itemLabel="name" itemValue="id"/> 
</form:select> 

Dans mon contrôleur je reçois l'objet autopopulated avec les informations utilisateur et je veux avoir pays mis à zéro lorsque l'option « -Selectionnez- » a été sélectionné. J'ai donc mis un initBinder avec un éditeur personnalisé comme ceci:

@InitBinder 
protected void initBinder(WebDataBinder binder) throws ServletException { 
    binder.registerCustomEditor(Country.class, "country", new CustomCountryEditor()); 
} 

et mon éditeur faire quelque chose comme ceci:

public class CustomCountryEditor(){ 
    @Override 
    public String getAsText() { 
     //I return the Id of the country 
    } 

    @Override 
    public void setAsText(String str) { 
     //I search in the database for a country with id = new Integer(str) 
     //and set country to that value 
     //or I set country to null in case str == null 
    } 
} 

Quand je soumets la forme cela fonctionne parce que quand j'ai pays à null quand j'ai sélectionné option "-Sélectionner un-" ou l'instance du pays sélectionné. Le problème est que quand je charge le formulaire j'ai une méthode comme la suivante pour charger l'information d'utilisateur.

@ModelAttribute("user") 
public User getUser(){ 
    //loads user from database 
} 

L'objet que je reçois de getUser() a fixé pays à un pays spécifique (pas une valeur nulle), mais dans la zone de liste déroulante est sélectionné aucune option. J'ai débogué l'application et le CustomCountryEditor fonctionne bien lors de la définition et de l'obtention du texte, la méthode thoughgetAsText est appelée pour chaque élément de la liste "pays" non seulement pour le champ "pays".

Une idée? Existe-t-il une meilleure façon de définir l'objet country null lorsque je sélectionne aucune option country dans la liste déroulante?

Merci

Répondre

1

Le problème était que je récupérais l'objet Utilisateur de l'objet principal de Spring Security. J'ai changé ma méthode getUser donc je reçois l'ID de Spring Security et je recherche dans la base de données et maintenant tout fonctionne, même si je ne comprends pas pourquoi cela se produit parce que je peux voir dans le debug que le pays a été chargé par Spring Sécurité.

0

Avez-vous vérifié la table de base de données pour l'utilisateur quelle valeur pour le pays est en cours d'lorsque vous enregistrez l'utilisateur ... est-il nulle est-il une valeur?

+0

J'ai un nombre, ce n'est pas nul dans la base de données. J'ai vérifié que cet id est le samenumber tel qu'il est retourné dans la méthode getAsText() de mon éditeur. – Javi

+0

pouvez-vous poster votre page jsp et le code du contrôleur pour modifier l'utilisateur. –

Questions connexes