Я использую Spring Boot 2.0.3 для REST-приложения.У меня странная ситуация.
У меня есть этот интерфейс:
public interface ConnectionPoolManager {
public Connection getConnection(@NotNull String tenantId, boolean longTask);
public DataSource getDataSource(@NotNull String tenantId, boolean longTask);
}
и его реализация:
@Component
@Profile({"prod"})
public class ConnectionPoolManagerImpl implements ConnectionPoolManager {
private Logger log = LogManager.getLogger();
private Map<String, DataSource> dataSourceMap = new ConcurrentHashMap<String, DataSource>();
private Map<String, DataSource> dataSourceLongConnectionsMap = new ConcurrentHashMap<String, DataSource>();
private Map<String, String> tenantDatabaseInstanceMap = new ConcurrentHashMap<String, String>();
@Autowired
private TenantRestClient tenantRestClient;
@Autowired
private PasswordEncrypt passwordEncrypt;
@Autowired
private Environment env;
@Autowired
private DataSource primaryDataSource;
/**
* At application startup we cache connection to all DB instances
*/
@PostConstruct
public void init() {
try {
log.info("Caching datasource connections...");
Set<String> databaseIds = tenantRestClient.findDatabaseInstanceIds();
//Creating datasource and caching them for later
databaseIds.forEach(s -> getLocalCache(false).put(s, createDataSource(s, false)));
databaseIds.forEach(s -> getLocalCache(true).put(s, createDataSource(s, true)));
log.info("Cached {} datasources", dataSourceMap.size());
} catch (Exception e) {
log.warn("Error trying to cache datasources.", e);
}
}
В этом классе я вызываю tenantRestClient.findDatabaseInstanceIds()
итам у меня проблема.
@Component
public class TenantRestClient {
private Logger log = LogManager.getLogger();
@Autowired
private RestTemplateBuilder restTemplateBuilder;
private RestTemplate restTemplate;
@PostConstruct
public void init() {
log.debug("------------INIT--------");
restTemplate = restTemplateBuilder.build();
log.debug("Post construct {} - {}", restTemplateBuilder, restTemplate);
log.debug("------------INIT COMPLETED --------");
}
public Set<String> findDatabaseInstanceIds() {
//my logic here
ResponseEntity<Set<String>> response = restTemplate.exchange(uriBuilder.toUriString(), HttpMethod.GET, entity, new ParameterizedTypeReference<Set<String>>() {
});
}
}
На самом деле метод findDatabaseInstanceIds () вызывается до вызова init ().Конечно, тогда у меня есть NullPointerException, потому что restTemplate имеет значение null.Как это возможно, бин tenantRestClient
готов и метод может быть вызван до вызова метода init ()?