Spring Framework Autocâblés Exception De Pointeur Null
Je suis l'apprentissage du Printemps et je vais avoir quelques problèmes en essayant de mettre en place un relativement basique projet pour le Printemps. Je suis en création d'une application de simplement lire à partir d'une base de données, mais je vais avoir des problèmes avec permettra à l'autowiring, ou l'absence de celui-ci. Mon GetCustomerEvent
classe est en train de lancer une exception de pointeur null dans la GetCustomers()
méthode, comme les CustomerService
variable n'a pas été initialisé. Quelqu'un peut-il me diriger dans la bonne direction ici?
Application.class
package org.ben.test.main;
@Configuration
@ComponentScan(basePackages={"org.ben.test.persistence", "org.ben.test.main"})
public class Application {
@Bean
public CustomerService customerService() {
return new CustomerService();
}
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dmds = new DriverManagerDataSource();
dmds.setDriverClassName("org.postgresql.Driver");
dmds.setUrl("jdbc:postgresql://localhost:5432/Customers");
dmds.setUsername("postgres");
dmds.setPassword("postgres");
return dmds;
}
@Bean
public JdbcTemplate jdbcTemplate() {
DataSource ds = getDataSource();
JdbcTemplate jdbc = new JdbcTemplate(ds);
return jdbc;
}
public static void main(String[] args) {
GetCustomerEvent ev = new GetCustomerEvent();
ev.GetCustomers();
}
}
CustomerService.class
package org.ben.test.persistence;
@Component
public class CustomerService {
@Autowired JdbcTemplate jdbcTemplate;
public CustomerService() {
}
public void getCustomers() {
jdbcTemplate.query("SELECT * FROM Customers", new RowMapper() {
@Override
public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
System.out.println(arg0.getString("firstName"));
return null;
}
});
}
}
GetCustomerEvent.class
package org.ben.test.persistence;
@Component
public class GetCustomerEvent {
@Autowired
CustomerService customerService;
public GetCustomerEvent() {
}
public void GetCustomers() {
customerService.getCustomers();
}
}
- Les Annotations sont simplement des métadonnées. Ils ne font rien sur leur propre.
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas de l'initialisation du Printemps Conteneur.
Vous devez créez votre contexte dans l'ordre pour que cela fonctionne.
@Autowired
fondamentalement, c'est la même chose que de raconter, de Printemps, de le faire avec des fichiers XML. Sur lecontext.getBean()
manuellement cela dépend vraiment de ce problème que vous devez résoudre, mais le faire une fois dans votre système l'habitude de faire du mal que de bien, et de même pour avoir un seul XML component-scan. =)new AnnotationConfigApplicationContext() ctx.register(Application .class) ctx.refresh()
.Problème est en dessous de la ligne
Vous avez créé manuellement instance à l'aide de la "nouvelle". Le printemps n'a pas idée à propos de cet objet. Voir Pourquoi est mon de Printemps @Autocâblés champ null? pour plus de détails.
Vous avez besoin pour créer le contexte de l'application, peu importe si vous êtes à l'aide de xml ou de l'annotation en fonction de la configuration.
Si votre application est une application web, voir ce post Chargement du contexte au Printemps à l'aide de web.xml pour charger le contexte de l'application
Une fois que vous avez l'application, vous pouvez obtenir la fève à l'aide de
context.getBean()
méthodeAussi, le printemps conteneur n'a pas de gérer les objets que vous créez à l'aide de l'opérateur new. Dans votre exemple, vous avez besoin de autowire la GetCustomerEvent bean