2012-11-21 2 views
-1

Je trouve un problème lors de la configuration d'un formulaire Struts pour une classe contenant une référence de membre à la même classe.Comment faire pour configurer un formulaire Struts avec un membre de classe récursif

class ExampleBean { 
    Integer id; 
    String name; 
    ExampleBean parent; 

    // Constructors, getters, setters 
} 

Lorsque vous accédez à la page Web contenant la forme, il semble que le processus entre dans une boucle infinie, jusqu'à ce qu'elle devienne une exception. J'utilise xdoclet pour générer le formulaire, s'il y a de l'aide.

Répondre

1

Vous ne fournissez pas assez d'informations (donc je ne peux que deviner ce qui se passe) mais je ne pense pas que ce soit un problème avec Struts. Lorsque vous utilisez des propriétés imbriquées dans votre formulaire Struts, vous spécifiez quelque chose comme ceci pour vos noms d'entrée HTML: parent.id et parent.name.

Lorsque Struts trouve ceci lors du remplissage de votre formulaire d'action avec des données de requête, il essaie de faire getParent().setId(...) et getParent().setName(...) sur votre formulaire. Si getParent() renvoie null, vous obtiendrez une erreur de BeanUtils, quelque chose comme java.lang.IllegalArgumentException: No bean specified. Donc, pour que la liaison du bean interne fonctionne, vous devez l'initialiser et ensuite laisser Struts faire la liaison.

par hasard que tu as fait quelque chose comme ceci:

class ExampleBean { 
    Integer id; 
    String name; 
    ExampleBean parent = new ExampleBean(); 

    // Constructors, getters, setters 
} 

parce que cela va provoquer une effet récursion infinie et un StackOverflowError lorsque la machine virtuelle Java tente de créer une instance.

Vous devriez vraiment montrer le code complet que vous utilisez!

Pour les situations de ce type, la méthode Struts du formulaire reset() est celle à utiliser. Vous n'indiquez pas l'initialisation par défaut dans la propriété interne du bean, mais vous créez le bean interne et l'initialisez dans le bean externe à l'intérieur de la méthode reset().

Questions connexes