【问题标题】:Creating a spring boot app and can't get @autowired to work创建一个 Spring Boot 应用程序并且无法让 @autowired 工作
【发布时间】:2018-05-12 05:29:10
【问题描述】:

如果我对输入文件位置进行硬编码,我可以很好地运行和构建它,但是当我尝试使用自动装配来填充该字段时,它就会死掉并且不会启动应用程序,因为它找不到我创建的豆子。所以我会给你们一个我所拥有的细分,欢迎任何反馈或想法!

注意 我正在运行 springboot 版本 1.4.2,因为我使用的是 Velocity,之后不再支持它,所以在您查看此内容时请记住这一点。如果您需要有关我的设置的更多信息或有任何澄清问题,请告诉我。谢谢!

好的,这是我的布局: application.yml

atb:
  #jons directory
  inputDirectory: C:/dev/git/agenttransferbatch/src/main/resources/testinputfile.txt
  #Geoff's directory
#  inputDirectoy: C:/dev/workspaces/agenttransferbatch/src/main/resources/testinputfile.txt
spring:dataSource:
    url: jdbc:db2://pmp.shelterinsurance.com
    driverClassName: com.ibm.db2.jcc.DB2Driver
    username: myusername
    password: mypassword

AppConfig.java

@Configuration
public class AppConfig
{
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigIn() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public String getInputDirectory(@Value("${inputDirectory}") String inputDirectory)
    {
        return inputDirectory;
    }

    @Bean
    public ProcessController getProcessController()
    {
        return new ProcessController();
    }
}

ProcessController.java

@Component
public class ProcessController
{
    @Autowired
    String inputDirectory;

@PostConstruct
public void init()
{
    if(inputDirectory != null && inputDirectory.length() > 0)
    {
        processInputFile();
    }
    else
    {
        System.out.println("filePath is null or length 0");
    }
}

private void processInputFile()
{
    // code to process my input file is here, not relevant to this problem so won't bore you with it.
}

}

AgttransApplication.java

@SpringBootApplication
@Component
public class  AgttransApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(AgttransApplication.class, args);
    }
}

文件结构

src
  main
    java
      com.shelter.agttrans
        configs
          AppConfig
        dataaccessobjects
          IndividualDAO
          WholesaleDAO
        dataobjects
          TransDataObject
        services
          ProcessController
        AgttransApplication
      controllers
        templates
          XMLController
    output
    resources
      application.yml
  test
  .gitignore
  build.gradle
  gradle.properties

运行时输出

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'inputDirectory' in string value "${inputDirectory}"
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:376) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1219) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:551) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:754) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at com.shelter.agttrans.AgttransApplication.main(AgttransApplication.java:13) [main/:na]
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'inputDirectory' in string value "${inputDirectory}"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) ~[spring-core-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:219) ~[spring-core-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:193) ~[spring-core-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172) ~[spring-context-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:813) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1079) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1059) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1128) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1022) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1131) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1059) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:589) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:370) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    ... 16 common frames omitted
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':bootRun'.
> Process 'command 'C:\Program Files\Java\jdk1.8.0_152\bin\java.exe'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 9.061 secs
Process 'command 'C:\Program Files\Java\jdk1.8.0_152\bin\java.exe'' finished with non-zero exit value 1
10:43:28 AM: External task execution finished 'bootRun'.

【问题讨论】:

  • 请添加堆栈跟踪

标签: java spring spring-boot gradle yaml


【解决方案1】:

对于字符串,你不需要定义一个bean并使用自动装配,你可以简单地在字段上使用@Value注解:

@Value("${inputDirectory}")
private String inputDirectory;

而且,由于您使用的是 yaml,正如@AHungerArtist 所说,您需要使用${atb.inputDirectory}

【讨论】:

  • 我尝试将自动接线取出并以这种方式进行操作并得到完全相同的错误。这与该 .yml 文件未被识别有关。我添加了另一个 application-default.yml 并将 spring 环境设置为完全无效的东西,它做了同样的事情。它没有将 application.yml 文件视为有效。我会将我的文件树放在此处的帖子中,以便您查看我的结构。也许它在那里。
【解决方案2】:

尝试将@Value("${inputDirectory}") 更改为@Value("${atb:inputDirectory}")@Value("${atb.inputDirectory}")

【讨论】:

  • 又没用了。我以前也试过。对不起,我没有提到。我现在确实保留了它,因为正如@Nir Levy 所说,无论如何它确实需要这样。谢谢你的收获。
  • 很遗憾,它没有。
  • 我在想也许 spring 1.4 不支持 .yml ???我现在正在尝试使用资源文件的旧 .properties 方法。如果有任何变化,会发布。
  • 不,这也无济于事......这非常令人沮丧......我让其他 3 位开发人员和我一样感到困惑。他们都看了我的代码,除了你们指出的之外,没有发现任何错误。这些事情现在已经解决了......不确定问题是什么。
  • 将其添加到正文中以便我可以使用代码标签
【解决方案3】:

所以事实证明,我的项目设置没有任何意义。我不得不对我们的 ivy 存储库的依赖项进行硬编码。到 ivy 存储库的默认链接与该过程有关,并且正在创建循环依赖项以及我们项目不需要的依赖项。这是我们用来硬编码 ivy 存储库链接的代码。

ivy {
    url "//ourserver/Repository/ivy-thirdparty"
    layout "pattern", {
        ivy "[organisation]/[module]/[revision]/[module]-[revision].xml"
        artifact "[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"
    }
}

希望这个答案能帮助其他任何关注这个问题的人。但是这里发布的代码很干净,如果有人需要模板,也可以用于其他设置。

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 2017-08-09
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2018-06-25
    相关资源
    最近更新 更多