java - spring boot中多个配置属性@Autowired其中一个属性为null

标签 java spring-boot amazon-sqs

我是 spring 的新手,我有以下引导应用程序类。我正在尝试从 Spring 启动应用程序连接到 AWS SQS。代码如下:

@SpringBootApplication
@EnableConfigurationProperties ({ApplicationProperties.class, AwsProperties.class})
public class Application{
    private static final Logger logger = LoggerFactory.getLogger(Application.class);    
    public static void main(String[] args) throws IOException {
        SpringApplication.run(Application.class, args);
    }
}

ApplicationProperties.java

@Configuration
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix="midb")
public class ApplicationProperties {

    private String keyStore;
    private String keyStorePassword;

// getter and setters
}

AwsProperties.java

@Configuration
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix="aws")
public class AwsProperties {

    private String sqsEndpoint;
    private String accessKey;
    private String secretKey;
// getters and setters
}


@Configuration
@EnableJms
@EnableConfigurationProperties(AwsProperties.class)
public class JmsConfig {

    private static final Logger logger = LoggerFactory.getLogger(JmsConfig.class);


    @Autowired
    private AwsProperties awsProperties;

    @Autowired
    private SQSListener sqsListener;
    @PostConstruct
    public void init() {
        //System.out.println("================== " + awsProperties.toString() + "==================");// End point:"+endpoint);
    }

    @Bean
    public AmazonSQSClient createSQSClient() {

        AmazonSQSClient amazonSQSClient = new AmazonSQSClient(new BasicAWSCredentials(awsProperties.getAccessKey(), awsProperties.getSecretKey()));
        amazonSQSClient.setEndpoint(awsProperties.getSqsEndpoint());
        amazonSQSClient.createQueue(awsProperties.getSqsQueueName());
        return amazonSQSClient;
    }

    @Bean
    public DefaultMessageListenerContainer jmsListenerContainer() {
        SQSConnectionFactory sqsConnectionFactory = SQSConnectionFactory.builder()
                .withAWSCredentialsProvider(new DefaultAWSCredentialsProviderChain())
                .withEndpoint(awsProperties.getSqsEndpoint()).withAWSCredentialsProvider(awsCredentialsProvider)
                .withNumberOfMessagesToPrefetch(10).build();
        DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
        dmlc.setConnectionFactory(sqsConnectionFactory);
        dmlc.setDestinationName(awsProperties.getSqsQueueName());
        dmlc.setMessageListener(sqsListener);
        return dmlc;
    }

    @Bean
    public JmsTemplate createJMSTemplate() {
        SQSConnectionFactory sqsConnectionFactory = SQSConnectionFactory.builder()
                .withAWSCredentialsProvider(awsCredentialsProvider).withEndpoint(awsProperties.getSqsEndpoint())
                .withNumberOfMessagesToPrefetch(10).build();
        JmsTemplate jmsTemplate = new JmsTemplate(sqsConnectionFactory);
        jmsTemplate.setDefaultDestinationName(awsProperties.getSqsQueueName());
        jmsTemplate.setDeliveryPersistent(false);
        return jmsTemplate;
    }

    private final AWSCredentialsProvider awsCredentialsProvider = new AWSCredentialsProvider() {
        @Override
        public AWSCredentials getCredentials() {
            return new BasicAWSCredentials(awsProperties.getAccessKey(), awsProperties.getSecretKey());
        }

        @Override
        public void refresh() {
        }
    };
}

在构建 Maven 时,出现以下错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'createSQSClient' defined in class path resource [io/bigbear/midb/sqs/JmsConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.amazonaws.services.sqs.AmazonSQSClient]: Factory method 'createSQSClient' threw exception; nested exception is java.lang.IllegalArgumentException: Access key cannot be null.

最佳答案

我不确定,但您的 awsProperties.getAccessKey() 似乎返回 null。

关于java - spring boot中多个配置属性@Autowired其中一个属性为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49327127/

相关文章:

java - getter 和 setter 在 recyclerview android 中没有按预期工作

spring - SonarQube分析问题

unit-testing - 是否有内存中的 SQS?

java - 在对 Spring Boot REST API 的多次调用中使用相同的 JDBC 连接

java - 有没有办法找出谁在阅读我的 SQS 消息?

amazon-web-services - 从 Lambda@Edge 触发另一个 Lambda 函数

java - 下面的代码分析是什么意思?

java - REST Controller 中具有一对多关系的实体的递归 JSON View

java - 在 Delphi 上使用 Wininet API 的 HTTP POST

java - 如何在Spring Boot中实现单线程调度器?