4

我有一个其他 Spring Boot 项目使用的常见 Spring Boot 项目。所以,我有一个多模块设置。

公共项目使用Java Mail,我想在公共项目中配置它。

根据Spring Boot 文档

如果spring.mail.host相关库(由 spring-boot-starter-mail 定义)可用,JavaMailSender则如果不存在则创建默认值。

所以,这是我的library.yml文件,

---
spring:
    mail:
        host: mobile.example.com
        port: 25

这是我的 gradle 文件:

plugins {
    id 'java'
    id 'eclipse'
    id 'maven-publish'
    id 'io.spring.dependency-management' version '1.0.3.RELEASE'
}

repositories {
   mavenCentral()
   mavenLocal()
}

group = 'com.example.test'
version = '1.0.0'

jar {
   baseName = 'boot-library-test'
   version = '1.0.0'
}

dependencies {

    compile('org.springframework.boot:spring-boot-starter')
    compile('org.springframework.boot:spring-boot-starter-mail')
    testCompile('org.springframework.boot:spring-boot-starter-test')
 }

 dependencyManagement {
     imports { mavenBom('org.springframework.boot:spring-boot-
     dependencies:1.5.4.RELEASE') }
  }

所以,我认为我已经满足了 spring 创建JavaMailSender. 正确的?

我有这个配置类:

package com.example.library;

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;

@Configuration
public class LibraryApplicationConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer dataProperties() {
      PropertySourcesPlaceholderConfigurer 
propertySourcesPlaceholderConfigurer = new 
PropertySourcesPlaceholderConfigurer();
      YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
      yaml.setResources(new ClassPathResource("library.yml"));
      propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
      return propertySourcesPlaceholderConfigurer;
    }
} 

这是我希望 Spring Boot 连接 JavaMailSender 的地方:

package com.example.library.mail;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;

@Component
public class Mail {

    private final JavaMailSender javaMailSender;

    public Mail(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
   }

   public JavaMailSender getJavaMailSender() {
        return javaMailSender;
    }    
}

这是我的测试配置:

package com.example.library;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages="com.example.library")
public class LibraryTestConfiguration {
}

和测试本身:

package com.example.library;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.example.library.mail.Mail;

@RunWith(SpringRunner.class)
@SpringBootTest(classes=LibraryTestConfiguration.class)
public class LibraryTest {

    @Autowired
    private Mail mail;

     @Test
     public void contextLoads() {
         assertThat(mail.getJavaMailSender()).isNotNull();
     }
}

但是测试失败了

原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“org.springframework.mail.javamail.JavaMailSender”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释:{}

如果我更改library.ymlapplication.yml(并删除PropertySourcesPlaceholderConfigurerbean),它会起作用。(我这里有所有代码,所以如果你尝试,你应该得到相同的结果。)但由于这是一个库,我无法命名该文件application.yml,因为它会与使用该库的其他 Spring Boot 项目冲突。此外,我想使用 yml 文件而不是属性文件(所以我不能使用@PropertySource)。

如何JavaMailSender使用 yml 道具在库项目中创建和连接 Spring Boot?

4

0 回答 0