环境变量始终为null。科特林春天

时间:2018-07-25 11:57:52

标签: spring-boot kotlin environment-variables

我在春季遇到环境变量问题。 我想检索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) {

2 个答案:

答案 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}

该属性将设置为“测试” 因此,由于某种原因,配置文件未设置。我当然已经在配置中设置了配置文件(本地运行)