Java 在Spring引导应用程序中,未使用自动连线注释将数据源从配置类绑定到控制器
我正在SAP Neo试用版上部署war文件,并与Hana数据库实例绑定。我能够在Java 在Spring引导应用程序中,未使用自动连线注释将数据源从配置类绑定到控制器,java,spring-boot,hana,sap-cloud-platform,Java,Spring Boot,Hana,Sap Cloud Platform,我正在SAP Neo试用版上部署war文件,并与Hana数据库实例绑定。我能够在NeoConfig类中获取数据源,但在控制器数据源依赖项注入中,它不工作,对象为null @Configuration public class NeoConfig { DataSource ds = null; private static final Logger log = LoggerFactory.getLogger(NeoConfig.class); @Bean(destroyM
NeoConfig
类中获取数据源,但在控制器数据源依赖项注入中,它不工作,对象为null
@Configuration
public class NeoConfig {
DataSource ds = null;
private static final Logger log = LoggerFactory.getLogger(NeoConfig.class);
@Bean(destroyMethod = "")
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException, SQLException {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
// InitialContext ctx = new InitialContext();
DataSource ds = dataSourceLookup.getDataSource("java:comp/env/jdbc/DefaultDB");
// ds = (DataSource) ctx.lookup("java:comp/env/jdbc/DefaultDB");
DBInformation dbInfo = new DBInformation(ds.getConnection().getMetaData());
log.info(dbInfo.toString());
return ds;
}
}
控制器:
@RestController
@RequestMapping("/")
public class HomeController {
private static final Logger log = LoggerFactory.getLogger(HomeController.class);
String returnMessage = null;
@Autowired
DataSource dataSource;
// @Autowired ApplicationInstanceInfo instanceInfo;
@GetMapping("/hello")
public String home(Model model) {
Map<Class<?>, String> services = new LinkedHashMap<Class<?>, String>();
if (dataSource != null) {
services.put(dataSource.getClass(), toString(dataSource));
model.addAttribute("services", services.entrySet());
returnMessage = "Datasource";
} else {
returnMessage = "NoBinding";
}
server.contextPath=/
spring.autoconfigure.exclude=DataSourceAutoConfiguration.class
Context.xml
为数据源指定bean名称
@Configuration
public class NeoConfig {
private static final Logger log = LoggerFactory.getLogger(NeoConfig.class);
@Primary
@Bean("dataSource")
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException, SQLException {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
// InitialContext ctx = new InitialContext();
DataSource ds = dataSourceLookup.getDataSource("java:comp/env/jdbc/DefaultDB");
// ds = (DataSource) ctx.lookup("java:comp/env/jdbc/DefaultDB");
DBInformation dbInfo = new DBInformation(ds.getConnection().getMetaData());
log.info(dbInfo.toString());
return ds;
}
}
现在您可以通过
@Qualifier(“dataSource”)
或@PersistenceContext(unitName=“dataSource”)
访问这个bean,自动连接的
字段不能为null
。如果是这样,应用程序就不会启动。另外,为什么不简单地使用spring.datasource.jndi name=jdbc/DefaultDB
来获取数据源呢。您的代码存在连接泄漏(您正在使用连接,但没有关闭它!)。它不能与@PersistenceContext
和@限定符一起使用,当只有一个数据源时,名称也不相关。@M.Deinum您能建议使用相同的名称吗?
@Configuration
public class NeoConfig {
private static final Logger log = LoggerFactory.getLogger(NeoConfig.class);
@Primary
@Bean("dataSource")
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException, SQLException {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
// InitialContext ctx = new InitialContext();
DataSource ds = dataSourceLookup.getDataSource("java:comp/env/jdbc/DefaultDB");
// ds = (DataSource) ctx.lookup("java:comp/env/jdbc/DefaultDB");
DBInformation dbInfo = new DBInformation(ds.getConnection().getMetaData());
log.info(dbInfo.toString());
return ds;
}
}