Не привязывает источник данных из класса конфигурации к контроллеру с аннотацией с автопроводкой в ​​приложении Spring Boot - PullRequest
0 голосов
/ 16 октября 2019

Я развертываю файл war в пробной версии SAP Neo и привязываюсь к экземпляру базы данных Hana. Я могу получить источник данных в NeoConfig классе, но в инъекции зависимостей источника данных контроллера он не работает, объект пуст.

@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";
        }

Application.properties:

server.contextPath=/

spring.autoconfigure.exclude=DataSourceAutoConfiguration.class

Context.xml

<Resource name="jdbc/DefaultDB"
          auth="Container"
          type="javax.sql.DataSource"
          factory="com.sap.jpaas.service.persistence.core.JNDIDataSourceFactory"/>

1 Ответ

0 голосов
/ 16 октября 2019

Дайте имя компонента для источника данных

@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")

...