Je suis très nouveau dans Spring Boot et je ne parviens pas à configurer mon projet de manière à ce qu'il puisse communiquer avec SQL Server - plus précisément, ma variable d'instance JDBCTemplate est null et, pour une raison quelconque, n'est pas "auto-câblé" avec la source de données que j'ai spécifiée dans mon fichier application.properties. Ce sont les mesures que j'ai prises jusqu'à présent:
Je vais commencer par afficher le contenu de mon fichier 'application.properties':
spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb
spring.datasource.username=sa
spring.datasource.password=myPassword
spring.datasource.driverClassName=com.Microsoft.sqlserver.jdbc.SQLServerConnection
spring.datasource.initialize=true
Ci-dessous, ma classe 'JDBCTemplate.Java' qui contient mes méthodes CRUD:
package demo;
import Java.util.List;
import org.Apache.Tomcat.jdbc.pool.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
public class BranchJDBCTemplate implements BranchDAO {
private DataSource dataSource;
@Autowired
protected JdbcTemplate jdbcTemplateObject;
@Autowired
@Override
public void setDataSource(DataSource ds) {
this.dataSource = ds;
this.jdbcTemplateObject = new JdbcTemplate(dataSource);
}
@Override
public void create(String name) {
String SQL = "insert into branches (name) values (?)";
jdbcTemplateObject.update(SQL, name);
System.out.println("Created Record Name = " + name);
return;
}
@Override
public Branch getBranch(Integer id) {
String SQL = "select * from branches where id = ?";
Branch student = jdbcTemplateObject.queryForObject(SQL,
new Object[]{id}, new BranchMapper());
return student;
}
@Override
public List<Branch> listBranches() {
String SQL = "select * from branches";
List <Branch> branches = jdbcTemplateObject.query(SQL, new BranchMapper());
return branches;
}
@Override
public void delete(Integer id) {
String SQL = "delete from branches where id = ?";
jdbcTemplateObject.update(SQL, id);
System.out.println("Deleted Record with ID = " + id );
return;
}
@Override
public void update(Integer id, String name) {
String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update(SQL, id);
System.out.println("Updated Record with ID = " + id );
return;
}
}
Et enfin, voici ma classe 'CustController.Java' qui contient le mappage de demandes dans lequel j'utilise la classe JDBCTemplate pour effectuer une opération de base de données:
package demo;
import Java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CustController {
@RequestMapping("/customer")
public Cust customer(@RequestParam(value="name", required=false, defaultValue="World") String name) {
BranchJDBCTemplate branchTemplate = new BranchJDBCTemplate();
List<Branch> branchesList = branchTemplate.listBranches();
for (Branch branch : branchesList) {
System.out.print("ID : " + branch.getId());
}
return new Cust(12, "Test", "Test");
}
}
Le problème que je rencontre comme mentionné précédemment est que mon instance de jdbcTemplateObject ...
protected JdbcTemplate jdbcTemplateObject;
est null et donc jette une exception sur la ligne suivante:
List <Branch> branches = jdbcTemplateObject.query(SQL, new BranchMapper());
Il n'est pas initialisé automatiquement. Quelqu'un peut-il indiquer ce que je fais mal?
Merci beaucoup!
Tony
Vous avez raison, vous devez disposer de beans.xml avec la source de données configurée.
Dans la méthode client () de la classe CustController, vous utilisez un nouvel opérateur en tant que:
BranchJDBCTemplate branchTemplate = new BranchJDBCTemplate();
et ainsi, cette instance branchTemplate n'est pas gérée par un ressort et la source de données n'est donc pas auto-câblée, ce qui entraîne la valeur null de jdbctemplate.
À la place, utilisez l'annotatioan comme:
@Repository("branchDao")
public class BranchJDBCTemplate implements BranchDAO {
...
}
et accédez à branchTemplate dans CustController en tant que:
@RestController
public class CustController {
@Autowired
@Qualifier("branchDao")
BranchJDBCTemplate branchTemplate;
...
}
essayez d'utiliser les éléments suivants dans votre fichier application.properties
spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb;integratedSecurity=false;