Spring Boot VS Code中的Sping Boot Yaml属性占位符转义字符与IntelliJ行为不一致

ff29svar  于 2023-06-22  发布在  Spring
关注(0)|答案(1)|浏览(152)

我在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 应用中使用:

  • 我们使用@ConfigurationPropertiesapplication.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

hs1ihplo

hs1ihplo1#

由于您没有使用环境变量,而是使用环境特定的属性文件,因此您可以摆脱占位符并替代属性。
例如在application.yml中:

destinationUri: kafka://kafkaserver:9092/some_topic

在application-dev.yml中:

destinationUri: kafka://localhost:9092/some_topic

相关问题