尝试在Tomcat(而不是嵌入式Tomcat)上部署Spring Boot应用程序。我已经在Tomcat服务器配置上配置了Java邮件会话,并且试图在我的应用程序中将其作为JNDI值进行访问。由于某种原因,我的应用出现错误并显示以下内容:
Caused by: java.lang.IllegalArgumentException: The local resource link [support] that refers to global resource [mail/support] was expected to return an instance of [javax.mail.Session] but returned an instance of [javax.mail.Session]
at org.apache.naming.factory.ResourceLinkFactory.getObjectInstance(ResourceLinkFactory.java:163)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
at org.apache.naming.NamingContext.lookup(NamingContext.java:840)
我已将javax.mail.jar
包含在Tomcat /lib
文件夹中。我的spring-boot-starter-mail
中也有pom.xml
我尝试从Tomcat的库中删除javax.mail.jar
,但这会导致Tomcat启动出错,因为它无法创建邮件会话。我也尝试过删除spring-boot-starter-mail,但这会干扰一些需要JavaMailSender和其他邮件组件的代码。我曾尝试弄乱JNDI导入和类似的东西,但无济于事。我还尝试检查spring-boot-starter-mail
包含的邮件jar的版本,并在Tomcat中更新该jar以使其匹配。我还检查了我在Maven中的可传递依赖项,以查看是否引入了其他邮件实现,什么也没有。所以我有点主意。
这是在我的web.xml中获取JNDI值的位置:
<resource-ref>
<description>The mail session configured in Tomcat</description>
<res-ref-name>mail/support</res-ref-name>
<res-type>javax.mail.Session</res-type>
<res-auth>Container</res-auth>
</resource-ref>
这是我在Tomcat的server.xml
中配置的:
<GlobalNamingResources>
<Resource name="mail/support"
auth="Container"
type="javax.mail.Session"
mail.smtp.host="smtp.XXX.XXX"
mail.smtp.user="support"
mail.smtp.from="support@XXX.org" />
</GlobalNamingResources>
这是context.xml中的内容:
<Context>
<ResourceLink global="mail/support" name="mail/support" type="javax.mail.Session" />
</Context>
我希望能够使用spring-boot-starter-mail
,并使用全局配置的JNDI邮件会话。我不知道这些是否只是不相容的愿望,但我不明白为什么要这么做。
答案 0 :(得分:0)
好,所以解决方案确实是@Bill Shannon建议的。我必须在Maven com.sun.mail
范围中包括provided
依赖项。我的特别问题是该项目已经在使用spring-boot-starter-mail
依赖项,其中包括com.sun.mail
jar。所以我不得不从我的Maven依赖中排除它。因此,与邮件相关的完整Maven依赖关系如下所示:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<exclusions>
<exclusion>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
</exclusion>
</exclusions>
</dependency>
现在看来有点明显。我认为我的主要困惑来源是奇怪的Tomcat错误消息。感谢所有看过此内容的人,希望这可以解决其他人的问题!