2010-06-11 5 views
1

va ici un objet de commande qui doit être rempli d'une forme de printempsQuestion sur la création d'instance en utilisant Spring framework?

public class Person { 

    private String name; 
    private Integer age;  

    /** 
     * on-demand initialized 
     */ 
    private Address address; 

    // getter's and setter's 

} 

et adresse

public class Address { 

    private String street; 

    // getter's and setter's 

} 

Supposons maintenant les éléments suivants MultiActionController

@Component 
public class PersonController extends MultiActionController { 

    @Autowired 
    @Qualifier("personRepository") 
    private Repository<Person, Integer> personRepository; 

    /** 
     * mapped To /person/add 
     */ 
    public ModelAndView add(HttpServletRequest request, HttpServletResponse response, Person person) throws Exception { 
     personRepository.add(person); 

     return new ModelAndView("redirect:/home.htm"); 
    } 

} 

Comme attribut Adresse des besoins personne Pour être initialisé à la demande, je dois redéfinir newCommandObject pour créer une instance de la propriété Adresse de l'initiaze. Sinon, je vais obtenir NullPointerException

@Component 
public class PersonController extends MultiActionController { 

    /** 
     * code as shown above 
     */ 

    @Override 
    public Object newCommandObject(Class clazz) thorws Exception { 
     if(clazz.isAssignableFrom(Person.class)) { 
      Person person = new Person(); 
      person.setAddress(new Address()); 

      return person; 
     } 
    } 

} 

Ok, Expert Spring MVC et Web flux dit

Options pour la création d'objet alternatif comprennent tirant une instance d'un BeanFactory ou par injection de méthode pour revenir en toute transparence un nouvelle instance

Première option

  • tirant une instance d'un BeanFactory

peut être écrit comme

@Override 
public Object newCommandObject(Class clazz) thorws Exception { 
    /** 
     * Will retrieve a prototype instance from ApplicationContext whose name matchs its clazz.getSimpleName() 
     */ 
    getApplicationContext().getBean(clazz.getSimpleName()); 
} 

Mais qu'est-ce qu'il veut dire par par injection de méthode de manière transparente retourner une nouvelle inst an ??? Pouvez-vous montrer comment j'implémente ce qu'il a dit ???

ATT ATT: Je sais que cette fonctionnalité peut être remplie par un SimpleFormController au lieu de MultiActionController. Mais il est montré comme un exemple, rien d'autre

+0

Y a-t-il une raison pour laquelle vous utilisez 'MultiActionController'? Il est obsolète au printemps 3, vous devriez vraiment utiliser '@ Controller 'à la place, c'est beaucoup plus facile. – skaffman

+0

@skaffman Désolé, je n'utilise pas Spring 3.0 (Et je sais qu'il est obsolète au printemps 3.0) et je peux obtenir la même convention sur la configuration sans aucune annotation Spring 3.0 MVC. Je vous remercie! –

+0

Vous pouvez également utiliser '@ Controller' dans Spring 2.5, vous n'avez pas besoin de la version 3.0. La liaison commande-objet est beaucoup plus simple à comprendre. Et votre code est déjà jonché d'annotations Spring MVC, je ne comprends pas que vous hésitiez à utiliser '@ Controller'. – skaffman

Répondre

1

Je suis sûr qu'il consiste à utiliser le système lookup-method comme indiqué dans chapter 3 of the spring reference manual

Le seul côté est que <lookup-method> nécessite un pas de méthode arg plutôt que la newCommandObject(Class) méthode de MultiActionController.

cela peut être résolu avec quelque chose comme:

public abstract class PersonController extends MultiActionController { 

    /** 
     * code as shown above 
     */ 

    @Override 
    public Object newCommandObject(Class clazz) thorws Exception { 
     if(clazz.isAssignableFrom(Person.class)) { 
      return newPerson(); 
     } 
    }       

    public abstract Person newPerson(); 
} 

dans le fichier de contexte:

<bean id="personController" class="org.yourapp.PersonController"> 
    <lookup-method name="newPerson" bean="personPrototype"/> 
</bean> 

L'inconvénient est que l'utilisation de ce genre de chose est vous un peu coincé avec la configuration du contrôleur bean via xml il n'est pas possible (certainement dans < 3) de le faire avec des annotations.

+0

Merci. Je pense que tu as raison. Pas moyen d'obtenir le même comportement en utilisant les annotations Spring ??? –

Questions connexes