diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/JndiSessionConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/JndiSessionConfiguration.java new file mode 100644 index 0000000000..cf851058e9 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/JndiSessionConfiguration.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.mail; + +import javax.mail.Session; +import javax.naming.NamingException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnJndi; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jndi.JndiLocatorDelegate; + +/** + * Auto-configure a {@link Session} available on JNDI. + * + * @author Eddú Meléndez + * @author Stephane Nicoll + * @since 1.3.0 + */ +@Configuration +@ConditionalOnClass(Session.class) +@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name") +@ConditionalOnJndi +class JndiSessionConfiguration { + + @Autowired + private MailProperties properties; + + @Bean + @ConditionalOnMissingBean + public Session session() { + String jndiName = this.properties.getJndiName(); + try { + return new JndiLocatorDelegate().lookup(jndiName, Session.class); + } + catch (NamingException ex) { + throw new IllegalStateException(String.format( + "Unable to find Session in JNDI location %s", jndiName), ex); + } + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration.java index 62e566a1c4..af4494e788 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration.java @@ -18,27 +18,22 @@ package org.springframework.boot.autoconfigure.mail; import java.util.Map; import java.util.Properties; - import javax.activation.MimeType; -import javax.annotation.PostConstruct; -import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; -import javax.naming.NamingException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnJndi; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; +import org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration.MailSenderCondition; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; -import org.springframework.jndi.JndiLocatorDelegate; +import org.springframework.context.annotation.Import; import org.springframework.mail.MailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; @@ -52,115 +47,66 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; */ @Configuration @ConditionalOnClass({ MimeMessage.class, MimeType.class }) +@ConditionalOnMissingBean(MailSender.class) +@Conditional(MailSenderCondition.class) @EnableConfigurationProperties(MailProperties.class) +@Import(JndiSessionConfiguration.class) public class MailSenderAutoConfiguration { - @Configuration - @ConditionalOnClass(Session.class) - @ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name") - @ConditionalOnJndi - static class JndiSessionConfiguration { + @Autowired + private MailProperties properties; - @Autowired - private MailProperties properties; + @Autowired(required = false) + private Session session; - @Bean - @ConditionalOnMissingBean - public Session session() { - String jndiName = this.properties.getJndiName(); - try { - return new JndiLocatorDelegate().lookup(jndiName, Session.class); - } - catch (NamingException ex) { - throw new IllegalStateException(String.format( - "Unable to find Session in JNDI location %s", jndiName), ex); - } + @Bean + public JavaMailSenderImpl mailSender() { + JavaMailSenderImpl sender = new JavaMailSenderImpl(); + if (this.session != null) { + sender.setSession(this.session); } - + else { + applyProperties(sender); + } + return sender; } - @ConditionalOnMissingBean(MailSender.class) - @Conditional(MailSenderConfiguration.MailSenderCondition.class) - static class MailSenderConfiguration { - - @Autowired - private MailProperties properties; - - @Autowired(required = false) - private Session session; - - @Bean - public JavaMailSenderImpl mailSender() { - JavaMailSenderImpl sender = new JavaMailSenderImpl(); - if (this.session != null) { - sender.setSession(this.session); - } - else { - applyProperties(sender); - } - return sender; + private void applyProperties(JavaMailSenderImpl sender) { + sender.setHost(this.properties.getHost()); + if (this.properties.getPort() != null) { + sender.setPort(this.properties.getPort()); } - - private void applyProperties(JavaMailSenderImpl sender) { - sender.setHost(this.properties.getHost()); - if (this.properties.getPort() != null) { - sender.setPort(this.properties.getPort()); - } - sender.setUsername(this.properties.getUsername()); - sender.setPassword(this.properties.getPassword()); - sender.setDefaultEncoding(this.properties.getDefaultEncoding()); - if (!this.properties.getProperties().isEmpty()) { - sender.setJavaMailProperties(asProperties(this.properties.getProperties())); - } - } - - private Properties asProperties(Map source) { - Properties properties = new Properties(); - properties.putAll(source); - return properties; - } - - /** - * Condition to trigger the creation of a {@link JavaMailSenderImpl}. This kicks - * in if either the host or jndi name property is set. - */ - static class MailSenderCondition extends AnyNestedCondition { - - public MailSenderCondition() { - super(ConfigurationPhase.PARSE_CONFIGURATION); - } - - @ConditionalOnProperty(prefix = "spring.mail", name = "host") - static class HostProperty { - } - - @ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name") - static class JndiNameProperty { - } - + sender.setUsername(this.properties.getUsername()); + sender.setPassword(this.properties.getPassword()); + sender.setDefaultEncoding(this.properties.getDefaultEncoding()); + if (!this.properties.getProperties().isEmpty()) { + sender.setJavaMailProperties(asProperties(this.properties.getProperties())); } } - @Configuration - @ConditionalOnSingleCandidate(JavaMailSenderImpl.class) - static class MailSenderValidator { + private Properties asProperties(Map source) { + Properties properties = new Properties(); + properties.putAll(source); + return properties; + } - @Autowired - private MailProperties properties; - @Autowired - private JavaMailSenderImpl mailSender; + /** + * Condition to trigger the creation of a {@link JavaMailSenderImpl}. This kicks + * in if either the host or jndi name property is set. + */ + static class MailSenderCondition extends AnyNestedCondition { - @PostConstruct - public void validateConnection() { - if (this.properties.isTestConnection()) { - try { - this.mailSender.testConnection(); - } - catch (MessagingException ex) { - throw new IllegalStateException("Mail server is not unavailable", ex); - } - } + public MailSenderCondition() { + super(ConfigurationPhase.PARSE_CONFIGURATION); + } + + @ConditionalOnProperty(prefix = "spring.mail", name = "host") + static class HostProperty { + } + + @ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name") + static class JndiNameProperty { } } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderValidatorAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderValidatorAutoConfiguration.java new file mode 100644 index 0000000000..c55f06e965 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderValidatorAutoConfiguration.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.mail; + +import javax.annotation.PostConstruct; +import javax.mail.MessagingException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; +import org.springframework.context.annotation.Configuration; +import org.springframework.mail.javamail.JavaMailSenderImpl; + +/** + * {@link EnableAutoConfiguration Auto configuration} for testing mail service + * connectivity on startup. + * + * @author Eddú Meléndez + * @author Stephane Nicoll + * @since 1.3.0 + */ +@Configuration +@AutoConfigureAfter(MailSenderAutoConfiguration.class) +@ConditionalOnProperty(prefix = "spring.mail", value = "test-connection") +@ConditionalOnSingleCandidate(JavaMailSenderImpl.class) +public class MailSenderValidatorAutoConfiguration { + + @Autowired + private JavaMailSenderImpl mailSender; + + @PostConstruct + public void validateConnection() { + try { + this.mailSender.testConnection(); + } + catch (MessagingException ex) { + throw new IllegalStateException("Mail server is not unavailable", ex); + } + } + +} diff --git a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index 5d1895d5a7..7d9ef47e2a 100644 --- a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -42,6 +42,7 @@ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\ +org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\ diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfigurationTests.java index 086f12954b..fd4bdb6a8d 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfigurationTests.java @@ -209,6 +209,7 @@ public class MailSenderAutoConfigurationTests { EnvironmentTestUtils.addEnvironment(applicationContext, environment); applicationContext.register(configs); applicationContext.register(MailSenderAutoConfiguration.class); + applicationContext.register(MailSenderValidatorAutoConfiguration.class); applicationContext.refresh(); return applicationContext; }