Как настроить контроллер весной без компонентного сканирования в xml?
Я должен разработать очень масштабный проект для банка с использованием Spring MVC. Я уже решил пойти с конфигурацией XML. Моя задача - ограничить время запуска сервера. Там будет около 2000 контроллеров.
Я уже использую компонентное сканирование для сканирования @Controller
, Работало нормально. Но проблема в том, что когда я удаляю компонентное сканирование из XML и добавляю компонент контроллера с помощью конфигурации компонента вручную в XML, он не создает экземпляр контроллера в контейнере IOC. И дает мне 404 не найдена ошибка. Итак, как я могу настроить контроллер без сканирования компонентов в XML.
Ниже приведены мои примеры кода. Любая помощь?
сервлет-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
<!--<context:component-scan base-package="" />-->
</beans>
корневой context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="dataContext/data-context.xml" />
<bean id="contactSetupController" class="com.stl.afs.ci.cca.controller.ContactSetupController">
<property name="contactSetupDao" ref="contactSetupDao" />
</bean>
<bean id="contactSetupDao" class="com.stl.afs.ci.cca.controller.ContactSetupDao" scope="prototype">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
ContactSetupController.java
package com.stl.afs.ci.cca.controller;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/contactsetup")
public class ContactSetupController {
private static final Logger logger = LoggerFactory.getLogger(ContactSetupController.class);
private ContactSetupDao contactSetupDao;
public void setContactSetupDao(ContactSetupDao contactSetupDao) {
this.contactSetupDao = contactSetupDao;
}
@RequestMapping(method = RequestMethod.GET)
public String index(ModelMap model) {
contactSetupDao.showDepedency();
model.addAttribute("message", "Hello world! Nice to see you in the planet");
return "ci/contactsetup/index";
}
}
ContactSetupDao.java
package com.stl.afs.ci.cca.controller;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* Created by ARNAB on 1/8/2015.
*/
public class ContactSetupDao {
public ContactSetupDao() {
System.out.println("------DAO------");
}
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@" + sessionFactory);
this.sessionFactory = sessionFactory;
}
@Transactional(readOnly = true)
public void showDepedency(){
Query query = sessionFactory.getCurrentSession().createSQLQuery("SELECT * FROM customers");
int i = 0;
for (Object o : query.list()) {
i++;
}
System.out.println(i);
}
}
2 ответа
How can I configure the controller without component scanning in XML?
, вы можете использовать аннотацию на основе конфигурации, чтобы избежать XML.
проверьте эту конфигурацию EnableWebMvc. Я настроил проект spring3.2 без конфигурации xml. это было полностью основано на аннотации.
перезаписать запуск веб-приложения Initializer
:
public class Initializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(WebAppConfig.class);
ctx.setServletContext(servletContext);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
servletContext.addListener(new ContextLoaderListener(ctx));
}
}
Файл конфигурации для контекста приложения
@Configuration
@ComponentScan("com.paul.nkp") // set your root package, it will scan all sub-package
@EnableWebMvc
@EnableTransactionManagement
@PropertySource("classpath:com/paul/nkp/application.properties")
public class WebAppConfig extends WebMvcConfigurerAdapter {
/**
* configured for read property values using @Value attibutes
*
* @return
*/
@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean(name = "multipartResolver")
public static MultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
@Bean
public LocalSessionFactoryBean sessionFactory() throws PropertyVetoException, IOException {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
......
sessionFactoryBean.setHibernateProperties(getHibernateProperties());
System.out.println("Session Factory Init");
return sessionFactoryBean;
}
}
Теперь все в коде, никаких манипуляций с XML. E сть ComponentScan
аннотация в файле конфигурации, которая сканирует все весенние аннотации из вашего базового пакета.
Проблема, почему вы получаете 404 - Not Found
это использование тега <context:annotation-config/>
только
<context:annotation-config/>
активирует только аннотацию на bean-компонентах, которые уже зарегистрированы в контексте вашего приложения, и выполняет базовую автоматическую разводку для вас. Он не распознает и не регистрирует бины.
Так что нет как такового нет Controllers
доступны для обработки запроса
Для настройки контроллеров вы либо переключаетесь обратно на context:component-scan
который в любом случае работает для вас (рассмотрите возможность принятия предложения М. Deinum при возврате) или вручную настройте контроллеры для соответствующих URL-адресов через HandlerMappings
например SimpleUrlHanslerMapping (не рекомендуется из-за многословия)
PS: прочитайте этот сказочный пост, обсуждая различия между <context:annotation-config>
а также <context:component-scan>