我在Sping Boot v2.3.12.RELEASE中遇到了以下问题。我的团队使用VS Code和IntelliJ来开发,我们正在使用属性占位符来运行这个有趣的行为。在IntelliJ中,我们使用\
转义${}
表示法,即\${}
。在VS Code中,\${}
对我们不起作用。
这是我们的财产在application.yml
中的样子
kafka://\${spring.kafka.producer.bootstrap-servers}/\${output-topic}
如果我们删除\
,那么这将在VS Code中工作,但在IntelliJ中失败。所以我们有点为难。有没有我们看不到的解决方案?谢谢你。
这些属性如何在我们的Sping Boot 应用中使用:
- 我们使用
@ConfigurationProperties
将application.yml
属性绑定到Java Bean
我们如何在VS Code中运行应用: - 我们使用VS Code启动配置来启动我们的应用
- 我们不使用环境变量。所有内容都在
application-{env}.yml
文件中维护 - 如果我们保留转义字符
\
,我可以看到我的占位符被求值了,但是我们会得到以下错误:
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'some.properties' to com.project.config.prop.ProjectProperties$$EnhancerBySpringCGLIB$$13a2c436 failed:
Property: video-pipeline.ocr-service.kafka-properties.destinationUri
Value: kafka://\localhost:9092/\some_topic
Origin: class path resource [application.yml]:196:30
Reason:
- 要使这一点在VS Code中起作用,我们必须删除
\
字符;但是,这会中断应用程序在IntelliJ中的启动
我们如何在IntelliJ中运行我们的应用: - 我们使用IntelliJ运行配置来运行Sping Boot 应用程序
- 我们不使用环境变量。yml文件中的占位符,即
\${spring.kafka.producer.bootstrap-server}
和\${output-topic}
在环境特定的yaml文件中配置,例如application-dev.yml, application-stage.yml, application-prod.yml
- 在IntelliJ中,如果我们删除转义字符
\
(以使VS Code用例正常工作),那么当我们尝试启动应用程序时会得到以下错误:
Execution failed for task ':app:processResources'.
> Could not copy file '/path/to/app/src/main/resources/application.yml' to '/path/to/app/build/resources/main/application.yml'.
> Missing property (spring) for Groovy template expansion. Defined keys [parent, classLoaderScope, dependencyMetaDataProvider, configurations, plugins, objects, logger, rootDir, path, testResultsDirName, targetCompatibility, java, artifactoryPassword, normalization, bootJar, childProjects, jar, model, state, processResources, serviceRegistryFactory, tasks, ext, projectDir, dependencyLocking, projectEvaluationBroadcaster, dependencyManagement, projectPath, testing, inheritedScope, version, script, dependencies, extensions, modelRegistry, projectEvaluator, projectConfigurator, archivesBaseName, logging, configurationActions, sourceCompatibility, status, subprojects, components, displayName, javaToolchains, parentIdentifier, antBuilderFactory, standardOutputCapture, docsDir, defaultTasks, crossProjectModelAccess, buildScriptSource, autoTargetJvmDisabled, reportsDir, baseClassLoaderScope, services, gradle, taskThatOwnsThisObject, distsDirName, buildFile, compileIntTestJava, depth, docsDirName, scmVersion, modelIdentityDisplayName, testResultsDir, buildDir, scriptHandlerFactory, deferredProjectConfiguration, project, repositories, scriptPluginFactory, testReportDir, checkstyle, group, artifacts, test, configurationTargetIdentifier, compileJava, fileResolver, internalStatus, name, testReportDirName, buildscript, springBoot, distsDirectory, libsDirectory, processOperations, asDynamicObject, publicType, classes, identityPath, description, sourceSets, buildPath, fileOperations, pluginManager, defaultArtifacts, detachedState, class, reporting, convention, owner, allprojects, pluginContext, ant, resources, clean, compileTestJava, rootScript, layout, artifactoryUsername, listenerBuildOperationDecorator, integrationTest, rootProject, libsDirName, properties, providers, base].
我们尝试了以下方法:
- 我们的酒店周围用单引号和双引号括起来
- 删除转义字符
\
,但这最终会破坏IntelliJ中的应用程序 - 我在Sprint Boot 项目和Spring Boot Tools项目中都找不到在线解决方案或任何相关问题
我能找到的唯一半相关的文档在这里提供在主要的Sping Boot repo中:https://github.com/spring-projects/spring-boot/commit/c0c67f2593dbfd17aa304b43f4da3a3678fa58eb
1条答案
按热度按时间hs1ihplo1#
由于您没有使用环境变量,而是使用环境特定的属性文件,因此您可以摆脱占位符并替代属性。
例如在application.yml中:
在application-dev.yml中: