ConfigurationPropertiesについてメソッド上でnullのデータソースを取得するこのピットを記録しましょう
2474 ワード
この件といえばちょっとエピソードがありますが、来たばかりの同僚がこの質問をしました.見ても大丈夫ですか.注入方法が間違っているのではないでしょうか.あるいはconfigurationは全然注入されていませんか?その場では解決しなかったが、このまっすぐなBOYは私が水だと言った.ああ、古い顔はどこに置いたのか.記録:
確かにここで値をとるdatasource=nullは、configがまだ注入されていないためですが、RestControllerでリクエストした後、Autowriedを使用してServiceに注入すると取得できます.
インタフェースリクエスト後、データソースが取得できるようになりました.事務補償メカニズムに似ていると思いますよね?後続の記入方法.その後、エンティティbeanを使用して注入方法を試してみましたが、事前に入手できるかどうか試してみました.
結果は!奇跡的には、起動時にnullを表示するか、リクエスト時にプロファイルの結果が得られます.従って,この属性はlazy特性であると推定できる.使用する前に、この方法が許容できるかどうかをよく考えなければなりません.
具体的なコンフィギュレーションプロperties注入方式などはこの部分まで検討してから詳しく説明しましょう.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import javax.sql.DataSource;
@Configuration
public class MyConfigFactory {
// ConfigurationProperties , 。 , ConfigurationProperties DataSource=null
@Value("${spring.datasource.username}")
private String username;
public String getUsername() {
return username;
}
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource", ignoreInvalidFields = true)
public DataSource getDataSource(){
DataSource dataSource = DataSourceBuilder.create().build();
return dataSource;
}
}
確かにここで値をとるdatasource=nullは、configがまだ注入されていないためですが、RestControllerでリクエストした後、Autowriedを使用してServiceに注入すると取得できます.
==================Service =========================
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
@Service
public class MyDataSourceService {
@Autowired
MyConfigFactory myConfigFactory;
public void getDataSource(){
DataSource dataSource = myConfigFactory.getDataSource();
System.out.println(dataSource);
}
}
==================Controller =========================
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private MyDataSourceService myDataSource;
@RequestMapping(value = "/info", method = RequestMethod.GET)
public String getInfo(){
myDataSource.getDataSource();
return "AAAAA";
}
}
インタフェースリクエスト後、データソースが取得できるようになりました.事務補償メカニズムに似ていると思いますよね?後続の記入方法.その後、エンティティbeanを使用して注入方法を試してみましたが、事前に入手できるかどうか試してみました.
結果は!奇跡的には、起動時にnullを表示するか、リクエスト時にプロファイルの結果が得られます.従って,この属性はlazy特性であると推定できる.使用する前に、この方法が許容できるかどうかをよく考えなければなりません.
具体的なコンフィギュレーションプロperties注入方式などはこの部分まで検討してから詳しく説明しましょう.