Как зарегистрировать аннотированный класс Spring @Configuration вместо файла applicationContext.xml в web.xml? - PullRequest
67 голосов
/ 10 ноября 2011

Я использую jsf и spring вместе в веб-приложении.Я настроил источник данных и фабрику сеансов в одном классе конфигурации, который использует аннотации, такие как @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 параметр в web.xml явно, он будет искать файл контекста пружины по умолчанию с именем applicationContext.xml в web.xml.Что мне делать, если я не хочу использовать файл контекста Spring и выполнять все настройки с аннотациями?Как мне зарегистрировать класс слушателя ContextLoaderListener, чтобы без использования файла xml и только аннотаций я мог запускать свое веб-приложение с использованием spring и jsf?

Ответы [ 2 ]

131 голосов
/ 10 ноября 2011

В 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 », здесь приведен пример из официальной документации 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>
11 голосов
/ 22 сентября 2014

Поднимите старый вопрос здесь, но с последними версиями 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"};
    }
}
...