Как я могу контролировать в своем загрузочном приложении Spring 2.1.4 (упакованном как WAR), создаю ли я веб-приложение сервлета 3.1 или 4.0. Обычно при использовании дескриптора веб-приложения web.xml атрибуты в веб-приложении сообщают об используемой версии спецификации. В приложении Spring WebApplicationInitializer без web.xml (как в моем случае) такой рекламы нет.
Нужно ли просто использовать только функции сервлета 3.1, развернуть их в контейнере и надеяться, что это сработает?




Файл web.xml является необязательным, поскольку в Servlet 3 и Java EE 6 были введены такие аннотации, как @WebServlet, @WebFilter, @WebListener.
Однако нет возможности объявить эту информацию за пределами web.xml с помощью WebApplicationInitializer, поэтому вам все равно придется включать файл и указывать версию.
После более чем года публикации этого вопроса я обнаружил, что maven делает такое определение по наличию определенного API, объявленного как зависимость. Например, если у вас есть зависимость javax.servlet:javax.servlet-api:4.0.1 в вашем файле Pom, maven примет контейнер сервлета 4.0. Я считаю, что Spring boot не поддерживает это, но я думаю, что должен. Кстати, плагин M2eclipse также работает таким же образом.
Как контейнер узнает, использует ли WAR-файл без web.xml возможности, которые его реализация не поддерживает? Например, если контейнер совместим с версией 3.1, обнаружит ли он, что WAR включает в себя функции 4.0, только тогда, когда произойдет сбой во время выполнения? Если это так, аннотацию в спецификации следует обновить, чтобы объявить спецификацию, которую требует файл WAR, точно так же, как в настоящее время это делает файл web.xml.