Как зарегистрировать аннотированный класс Spring @Configuration вместо файла applicationContext.xml в web.xml?

Я использую jsf и spring вместе в веб-приложении. Я настроил datasource и session factory в одном классе конфигурации, который использует аннотации, такие как @Configuration, @ComponentScan и т.д. У меня нет файла applicationContext.xml в моем проекте, поскольку я обрабатываю каждую запись контекста xml в классе конфигурации. Тест работает успешно, но когда я развертываю свое веб-приложение, это дает мне ошибку

java.lang.IllegalStateException: нет найденного WebApplicationContext: нет Зарегистрирован ли ContextLoaderListener?

Теперь, если я даю класс слушателя в web.xml,

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

это дает мне ошибку,

/WEB-INF/applicationContext.xml не найден

В соответствии с документом ContextLoaderListener, верно, что если я не дам явно contextConfigLocation param в web.xml явно, он будет искать контекстный файл spring по умолчанию applicationContext.xml в web.xml, Теперь, что мне делать, если я не хочу использовать контекстный файл spring и выполнять всю конфигурацию с аннотациями? Как я должен регистрировать класс слушателя ContextLoaderListener, чтобы без использования файла xml и использования только аннотаций я мог запускать свое веб-приложение с помощью spring и jsf?

Ответ 1

В web.xml вам нужно загрузить исходный код с помощью AnnotationConfigWebApplicationContext:

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            org.package.YouConfigurationAnnotatedClass
        </param-value>
    </init-param>
</servlet>

И не забудьте использовать @EnableWebMvc для ваших аннотаций MVC для ввода.

дальнейшее чтение:

ИЗМЕНИТЬ как "комментарии последующих" = > , чтобы быть Тьюринга завершена:

Да, конечно, вам нужен слушатель. Хотя приведенное выше полностью отвечает на вопрос "Как зарегистрировать аннотированный класс Spring @Configuration вместо файла applicationContext.xml в web.xml", вот example из Spring официальной документации, в которой будет размещен полный web.xml:

<web-app>
  <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
       instead of the default XmlWebApplicationContext -->
  <context-param>
      <param-name>contextClass</param-name>
      <param-value>
          org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
  </context-param>

  <!-- Configuration locations must consist of one or more comma- or space-delimited
       fully-qualified @Configuration classes. Fully-qualified packages may also be
       specified for component-scanning -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.acme.AppConfig</param-value>
  </context-param>

  <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- Declare a Spring MVC DispatcherServlet as usual -->
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
           instead of the default XmlWebApplicationContext -->
      <init-param>
          <param-name>contextClass</param-name>
          <param-value>
              org.springframework.web.context.support.AnnotationConfigWebApplicationContext
          </param-value>
      </init-param>
      <!-- Again, config locations must consist of one or more comma- or space-delimited
           and fully-qualified @Configuration classes -->
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>com.acme.web.MvcConfig</param-value>
      </init-param>
  </servlet>

  <!-- map all requests for /app/* to the dispatcher servlet -->
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/app/*</url-pattern>
  </servlet-mapping>
</web-app>

Ответ 2

Включение старого вопроса здесь, но с недавними версиями Spring (v3.0 +) теперь вы можете полностью избавиться от web.xml при условии, что вы развертываете свое приложение на веб-контейнере, который поддерживает Servlet 3.0+.

Можно реализовать интерфейс Spring WebApplicationInitializer для выполнения тех же конфигураций, что и в web.xml. Этот класс реализации будет автоматически обнаружен приложением Spring 3.0+, работающим на контейнерах Servlet 3.0+.

Если настройка довольно проста, вместо этого вы можете использовать другой класс, предоставляемый Spring, как показано ниже. Все, что нужно сделать, это установить классы @Configuration и отобразить сопоставления сервлетов. Поддерживает настройку очень просто.

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {

        return new Class[] {AppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {
                 "*.html"
                ,"*.json"
                ,"*.do"};
    }
}