Загрузчик пути к классам Tomcat javax.mail. Конфликт сеанса с spring-boot-starter-mail

Попытка развернуть приложение 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. Я не знаю, могут ли это быть просто несовместимые желания, но я не понимаю, почему они должны быть такими.

Проблема определенно связана с тем, что классы JavaMail находятся как в папке Tomcat lib, так и в вашем приложении. Вам нужно найти способ исключить их из вашего приложения.

Bill Shannon 12.07.2019 23:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
963
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, решение действительно было тем, что предложил @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. Спасибо всем, кто взглянул на это, надеюсь, это решит проблему для кого-то еще!

Другие вопросы по теме