灵感来自于:https://blog.csdn.net/tangfan1992/article/details/83010786

因为是自己做的项目,使用了微服务,但是加上了邮件配置之后,启动直接报错:

2018-11-20 16:31:31.634  WARN 9609 --- [on(2)-127.0.0.1] o.s.b.actuate.mail.MailHealthIndicator   : Mail health check failed

javax.mail.NoSuchProviderException: No provider for SMTP
	at javax.mail.Session.getProvider(Session.java:514) ~[javax.mail-1.6.1.jar:1.6.1]
	at javax.mail.Session.getTransport(Session.java:712) ~[javax.mail-1.6.1.jar:1.6.1]
	at javax.mail.Session.getTransport(Session.java:693) ~[javax.mail-1.6.1.jar:1.6.1]
	at org.springframework.mail.javamail.JavaMailSenderImpl.getTransport(JavaMailSenderImpl.java:535) ~[spring-context-support-5.0.8.RELEASE.jar:5.0.8.RELEASE]
	at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:514) ~[spring-context-support-5.0.8.RELEASE.jar:5.0.8.RELEASE]
	at org.springframework.mail.javamail.JavaMailSenderImpl.testConnection(JavaMailSenderImpl.java:396) ~[spring-context-support-5.0.8.RELEASE.jar:5.0.8.RELEASE]
	at org.springframework.boot.actuate.mail.MailHealthIndicator.doHealthCheck(MailHealthIndicator.java:43) ~[spring-boot-actuator-2.0.4.RELEASE.jar:2.0.4.RELEASE]
	at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(AbstractHealthIndicator.java:84) ~[spring-boot-actuator-2.0.4.RELEASE.jar:2.0.4.RELEASE]
	at org.springframework.boot.actuate.health.CompositeHealthIndicator.health(CompositeHealthIndicator.java:68) [spring-boot-actuator-2.0.4.RELEASE.jar:2.0.4.RELEASE]
	at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:47) [spring-boot-actuator-2.0.4.RELEASE.jar:2.0.4.RELEASE]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
	at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:223) [spring-core-5.0.8.RELEASE.jar:5.0.8.RELEASE]
	at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:76) [spring-boot-actuator-2.0.4.RELEASE.jar:2.0.4.RELEASE]
	at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:61) [spring-boot-actuator-2.0.4.RELEASE.jar:2.0.4.RELEASE]
	at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:126) [spring-boot-actuator-2.0.4.RELEASE.jar:2.0.4.RELEASE]
	at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:99) [spring-boot-actuator-2.0.4.RELEASE.jar:2.0.4.RELEASE]
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) [na:1.8.0_181]
	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) [na:1.8.0_181]
	at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) [na:1.8.0_181]
	at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) [na:1.8.0_181]
	at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309) [na:1.8.0_181]
	at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401) [na:1.8.0_181]
	at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) [na:1.8.0_181]
	at sun.reflect.GeneratedMethodAccessor92.invoke(Unknown Source) ~[na:na]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357) [na:1.8.0_181]
	at sun.rmi.transport.Transport$1.run(Transport.java:200) [na:1.8.0_181]
	at sun.rmi.transport.Transport$1.run(Transport.java:197) [na:1.8.0_181]
	at java.security.AccessController.doPrivileged(Native Method) [na:1.8.0_181]
	at sun.rmi.transport.Transport.serviceCall(Transport.java:196) [na:1.8.0_181]
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573) [na:1.8.0_181]
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834) [na:1.8.0_181]
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688) [na:1.8.0_181]
	at java.security.AccessController.doPrivileged(Native Method) [na:1.8.0_181]
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687) [na:1.8.0_181]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_181]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_181]
	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_181]

找了很久,网上都是说是邮件配置的问题,但是我直接进行测试,邮件能发出去的啊,很郁闷。因为上面的抛错是关于MailHealthIndicator 的,所以我就着重搜了一下

spring-boot-actuator 和  spring-boot-starter-mail 之间有没有冲突,终于,看到了前面那个大神的文章,顿时茅塞顿开。

所以加上了:

package com.cipop.base.config;

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class MailHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        int errorCode = check();
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode)  .build();
        }
        return Health.up().build();
    }

    int check(){
		//可以实现自定义的数据库检测逻辑
        return 0;
    }
}

这样就解决了。真的是很坑爹

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐