Java 在Spring引导应用程序中,未使用自动连线注释将数据源从配置类绑定到控制器

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

我正在SAP Neo试用版上部署war文件,并与Hana数据库实例绑定。我能够在
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;
    }
}