我有一个其他 Spring Boot 项目使用的常见 Spring Boot 项目。所以,我有一个多模块设置。
公共项目使用Java Mail,我想在公共项目中配置它。
如果
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.yml
为application.yml
(并删除PropertySourcesPlaceholderConfigurer
bean),它会起作用。(我这里有所有代码,所以如果你尝试,你应该得到相同的结果。)但由于这是一个库,我无法命名该文件application.yml
,因为它会与使用该库的其他 Spring Boot 项目冲突。此外,我想使用 yml 文件而不是属性文件(所以我不能使用@PropertySource
)。
如何JavaMailSender
使用 yml 道具在库项目中创建和连接 Spring Boot?