Попытка развернуть приложение Spring Boot на Tomcat (а не на встроенном Tomcat). Я настроил почтовый сеанс Java в конфигурации сервера Tomcat и пытаюсь получить к нему доступ как значение 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
Я попытался удалить javax.mail.jar
из библиотеки Tomcat, но это вызывает ошибку при запуске Tomcat, поскольку он не может создать почтовый сеанс. Я также пытался удалить spring-boot-starter-mail, но это мешало некоторым часть моего кода, который требует JavaMailSender и других почтовых компонентов. Я пытался возиться с импортом JNDI и тому подобным, но безрезультатно. Я также попытался проверить версию почтового банка, включенного в spring-boot-starter-mail
, и обновить банку в Tomcat, чтобы она соответствовала. Я также проверил свои транзитивные зависимости в Maven, чтобы увидеть, не загружается ли другая реализация почты, и ничего. Так что у меня совсем нет идей.
Вот где я получаю значение JNDI в своем файле web.xml:
<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 = "[email protected]" />
</GlobalNamingResources>
А вот что в context.xml:
<Context>
<ResourceLink global = "mail/support" name = "mail/support" type = "javax.mail.Session" />
</Context>
Я хотел бы иметь возможность использовать spring-boot-starter-mail
и использовать глобально настроенный почтовый сеанс JNDI. Я не знаю, могут ли это быть просто несовместимые желания, но я не понимаю, почему они должны быть такими.
Итак, решение действительно было тем, что предложил @Bill Shannon. Мне пришлось включить зависимость com.sun.mail
с областью действия Maven provided
. Моя особая проблема заключалась в том, что проект уже использовал зависимость spring-boot-starter-mail
, которая включает в себя банку com.sun.mail
. Поэтому мне пришлось исключить это из моей зависимости от 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. Спасибо всем, кто взглянул на это, надеюсь, это решит проблему для кого-то еще!
Проблема определенно связана с тем, что классы JavaMail находятся как в папке Tomcat lib, так и в вашем приложении. Вам нужно найти способ исключить их из вашего приложения.