【问题标题】:Spring boot application @Value property always returns nullSpring Boot 应用程序 @Value 属性始终返回 null
【发布时间】:2018-02-24 07:54:59
【问题描述】:

我正在使用 spring boot 1.5.7.RELEASE 并尝试将 application.yml 文件中的值注入到类中,但该值始终为 null。不过,该值确实会加载到我的类中。

我的基础包中有一个如下应用程序类

package com.mypackage;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

        VideoTranscoder vt = new VideoTranscoder();
        vt.createJob();
    }

}

我的班级,

package com.mypackage;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.elastictranscoder.AmazonElasticTranscoder;
import com.amazonaws.services.elastictranscoder.AmazonElasticTranscoderClientBuilder;
import com.amazonaws.services.elastictranscoder.model.CreateJobOutput;
import com.amazonaws.services.elastictranscoder.model.CreateJobRequest;
import com.amazonaws.services.elastictranscoder.model.JobInput;

//@Component
public class VideoTranscoder {

    private static final String PIPELINE_ID = "xxxxxxxxx-xxxx";

    private static final String INPUT_KEY = "video.avi";

    private static final String OUTPUT_KEY = "transcoded_video.mp4";

    private static final String PRESET_ID = "1351620000001-000061";

//    @Value("${s3.accessKey}")
//    private String accessKey;

    @Value("Hello")
    private String accessKey;

    @Value("${s3.secretKey}")
    private String secretKey;

    public void createJob() {
        System.out.println("SECRETKEY: " + secretKey);
        System.out.println("ACCESSKEY: " + accessKey);
        BasicAWSCredentials creds = new BasicAWSCredentials(accessKey, secretKey);

        AmazonElasticTranscoder amazonElasticTranscoder = AmazonElasticTranscoderClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(creds)).withRegion(Regions.US_EAST_1).build();

        JobInput input = new JobInput().withKey(INPUT_KEY);
        CreateJobOutput output = new CreateJobOutput().withKey(OUTPUT_KEY).withPresetId(PRESET_ID);
        CreateJobRequest createJobRequest = new CreateJobRequest().withPipelineId(PIPELINE_ID).withInput(input)
                .withOutputs(output);
        amazonElasticTranscoder.createJob(createJobRequest);

        System.out.println("DONE!");

    }
}

我的应用程序.yml,

s3:
  accessKey: XXXXXXXXXXXXXXXXXXXX
  secretKey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我收到以下错误,

SECRETKEY: null
ACCESSKEY: null
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.lang.IllegalArgumentException: Access key cannot be null.
    at com.amazonaws.auth.BasicAWSCredentials.<init>(BasicAWSCredentials.java:37)
    at com.mypackage.VideoTranscoder.createJob(VideoTranscoder.java:38)
    at com.mypackage.Application.main(Application.java:12)
    ... 8 more

为什么总是返回NULL??

请提供您的意见。

【问题讨论】:

  • 您注释掉了@Component 注释。
  • 注释掉@Component后还是一样

标签: java spring-boot


【解决方案1】:

您必须通过Spring 注入您的VideoTranscoder 才能使@Value 注释起作用。

目前您正在通过

创建VideoTranscoder 的新实例
VideoTranscoder vt = new VideoTranscoder();

并且你已经注释掉了VideoTranscoder中的@Component注解

所以把@Component带回VideoTranscoder

@Component
public class VideoTranscoder {

更新

并从 Spring 上下文中获取您的转码器:

@SpringBootApplication
public class Application {


    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        VideoTranscoder vt = (VideoTranscoder) ctx.getBean("videoTranscoder");
        vt.createJob();
    }

}

【讨论】:

  • 否 如果我在 main 之外定义,它会要求输入“静态”并返回“vt”为空
  • 是的,你是对的,对不起,我已经更新了我的答案。不用@Autowired,从应用上下文中获取bean即可
猜你喜欢
  • 2018-02-12
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多