我在春季遇到环境变量问题。 我想检索serviceAccount文件的名称,我的firestore数据库将需要此文件,具体取决于我的应用程序是在生产环境,测试环境还是开发环境上运行。
这是正在使用的application.yml文件-环境变量在AWS中设置。
spring:
profiles: aws
contentapi:
apikey: ${APIKEY}
firestore:
serviceAccount: ${SDKPATH:serviceAccount_dev.json}
我的默认/后备值是dev serviceAccount
我在Stackoverflow上确实读到过@value变量在构造函数完成之前没有初始化。
问题是我必须使用变量来连接数据库。
我尝试了@value注释,System.env和我在这里可以找到的所有其他建议,但没有一个起作用。
我该如何解决?似乎该变量始终为null。.
这是我的代码
@Configuration
@Service
class ArticleService {
@Value("\${contentapi.apikey}")
lateinit var contentapiKey:String
@Value("\${firestore.serviceAccount}")
lateinit var serviceAccount:String
var articleIds = ArrayList<String>()
var articleIdsNotSaved = ArrayList<String>()
private val articleContentApi = "https://content.watchmedier.dk/api/jyllands-posten/content/article/"
private val firebaseAdminSDK = this.javaClass.classLoader.getResourceAsStream(serviceAccount)
private val options = FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(firebaseAdminSDK))
.setDatabaseUrl("https://myprojectid.firebaseio.com")
.build()!!
private val firestore = FirebaseApp.initializeApp(options)
val databaseReference = FirestoreClient.getFirestore(firestore)
fun fetchRecommendations( appId:String, siteName:String, max:String, context:String) {
答案 0 :(得分:0)
如果要使用注释,则至少应避免使用按属性插入。并通过构造函数使用注入(避免使用lateinit)。这将更适合您的问题,因为您需要用于构造服务的属性。我将更改您的代码,例如:
@Service
class ArticleService(@Value("\${contentapi.apikey}") private val contentApiKey: String, @Value("\${firestore.serviceAccount}") private val serviceAccount: String) {
private val articleContentApi = "https://content.watchmedier.dk/api/jyllands-posten/content/article/"
private var firebaseAdminSDK: InputStream
init {
firebaseAdminSDK = this.javaClass.classLoader.getResourceAsStream(serviceAccount)
}
}
但是,如果您使用的是spring-boot和kotlin,则应该利用kotlin dsl:
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.builder.SpringApplicationBuilder
import org.springframework.context.support.beans
import org.springframework.core.env.Environment
import java.io.InputStream
class ArticleService(private val contentApiKey: String, private val serviceAccount: String) {
private val articleContentApi = "https://content.watchmedier.dk/api/jyllands-posten/content/article/"
private var firebaseAdminSDK: InputStream
init {
firebaseAdminSDK = this.javaClass.classLoader.getResourceAsStream(serviceAccount)
}
}
@SpringBootApplication
class ServiceApp
fun main(args: Array<String>) {
SpringApplicationBuilder()
.sources(ServiceApp::class.java)
.initializers(beans {
bean {
val properties = ref<Environment>()
ArticleService(properties.getProperty("contentapi.apikey")!!, properties.getProperty("firestore.serviceAccount")!!)
}
}).run(*args)
}
答案 1 :(得分:0)
application.yml似乎是问题所在。
如果已更新为此:
contentapi:
baseurl: https://content.watchmedier.dk
apikey: Test
firestore:
serviceAccount: testing
server:
port: 8080
---
spring:
profiles: aws
contentapi:
apikey: ${APIKEY:Test}
firestore:
serviceAccount: ${SDKPATH:erviceAccount_dev.json}
该属性将设置为“测试” 因此,由于某种原因,配置文件未设置。我当然已经在配置中设置了配置文件(本地运行)