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


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

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

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

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

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

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

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

2 66

2 ответа:

на 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, чтобы пнуть.

читайте далее:

редактировать как "комментарии последующие" = > чтобы быть Turing Complete:

да конечно, вам нужен слушатель. Хотя выше полностью отвечает на вопрос "как зарегистрировать Spring @Configuration аннотированный класс вместо applicationContext.xml-файл в интернете.xml" это пример из весенней официальной документации, которая раскладывает полный 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>

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

можно реализовать весной WebApplicationInitializer интерфейс для выполнения тех же конфигураций, что и в интернете.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"};
    }
}