使用subethamail搭建SMTP服务器收信时触发contextMap为空的空指针异常
问题根因
该空指针异常由SubethaMail的MDC上下文复制逻辑缺陷导致:
SubethaMail处理SMTP请求时会从线程池调度工作线程,调度前会尝试将主线程的MDC(Mapped Diagnostic Context,日志诊断上下文)复制到工作线程中。你主线程启动时没有初始化过MDC上下文,此时MDC.getCopyOfContextMap()返回值为null,而旧版本SubethaMail没有做非空校验,直接将null传入MDC.setContextMap()方法,但Log4j的MDC适配器不允许传入null的上下文Map,就触发了空指针。
可用解决方案
方案1:主线程初始化MDC上下文
在启动SMTPServer前添加一行代码初始化空的MDC上下文即可:public static void main(String[] args) throws Exception{ BasicConfigurator.configure(); // 新增以下代码初始化MDC MDC.setContextMap(new HashMap<>()); MessageListener messageListener = new MessageListener(new EmailContentService()); SMTPServer smtpServer = new SMTPServer( new SimpleMessageListenerAdapter(messageListener)); smtpServer.setPort(12110); //starting SMTP server smtpServer.start(); }注意导入
org.slf4j.MDC依赖包。方案2:升级SubethaMail版本
3.1.7及以上版本的SubethaMail已经修复了该问题,在调用setContextMap前增加了非空判断,直接升级依赖版本即可解决。方案3:检查日志依赖版本兼容性
确认项目中slf4j-api和对应的log4j适配器包(slf4j-log4j12对应Log4j1,log4j-slf4j-impl对应Log4j2)的版本保持一致,版本不兼容也可能触发该异常。
内容的提问来源于stack exchange,提问作者groot
相关产品推荐
相关产品推荐

