Как зарегистрировать 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 ответа:
на
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"}; } }