Я пишу очень упрощенное веб-приложение crm, и у меня возникла проблема с автоматическим подключением компонента hibernate sessionFactory в одном из моих классов DAO. Я искал интернет уже пару дней, и я совершенно сбит с толку, потому что мой конфиг, кажется, отражает те, которые, как говорят, работают в сети. В этом проекте я не использую XML.
класс конфигурации веб-сервлета
public class WebServletConfig implements WebApplicationInitializer
{
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
webContext.register(SpringConfig.class);
webContext.setServletContext(servletContext);
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(webContext));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
}
}
класс конфигурации пружины
@Configuration
@EnableWebMvc
@ComponentScan("com.crmproject")
public class SpringConfig implements WebMvcConfigurer
{
@Bean
public ViewResolver viewResolver()
{
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public MessageSource messageSource()
{
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("resources/messages");
return messageSource;
}
public void configureDefaultSevletHandling(DefaultServletHandlerConfigurer configurer)
{
configurer.enable();
}
}
файл конфигурации Hibernate
@Configuration
public class HibernateConfig
{
@Bean
public LocalSessionFactoryBean sessionFactory()
{
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan("com.crmproject.entity");
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource()
{
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimezone=UTC");
dataSource.setUsername("hbstudent");
dataSource.setPassword("hbstudent");
return dataSource;
}
private final Properties hibernateProperties()
{
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
hibernateProperties.setProperty("hibernate.show_sql", "true");
return hibernateProperties;
}
}
И я пытаюсь автоматически подключить sessionFactory в этом классе DAO, но когда я вызываю testMethod
, чтобы увидеть, был ли вставлен sessionFactory, он выдает NullPointerException
.
@Repository
public class CustomerDAOImpl implements CustomerDAO
{
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
public void testMethod()
{
System.out.println(sessionFactory.toString());
}
public CustomerDAOImpl()
{
System.out.println("in CustomerDAOImpl constructor");
}
public List<Customer> getCustomers()
{
return null;
}
public Integer saveCustomer(Customer customer)
{
return null;
}
public Customer getCustomer(Integer id)
{
return null;
}
public boolean updateCustomer(Integer id, Customer customer)
{
return false;
}
public boolean deleteCustomer(Integer id)
{
return false;
}
}
Исключение:
SEVERE: Servlet.service () для сервлета [dispatcher] в контексте с
path [/ crm2-project] вызвала исключение [Ошибка обработки запроса;
Вложенное исключение - java.lang.NullPointerException] с основной причиной
java.lang.NullPointerException в
com.crmproject.dao.CustomerDAOImpl.testMethod (CustomerDAOImpl.java:26)
в
com.crmproject.controller.CustomerController.listCustomers (CustomerController.java:31)
в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в
sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
в
sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
в java.lang.reflect.Method.invoke (Method.java:498) в
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke (InvocableHandlerMethod.java:209)
в
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest (InvocableHandlerMethod.java:136)
в
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle (ServletInvocableHandlerMethod.java:102)
в
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod (RequestMappingHandlerAdapter.java:877)
в
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal (RequestMappingHandlerAdapter.java:783)
в
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle (AbstractHandlerMethodAdapter.java:87)
в
org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:991)
в
org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:925)
в
org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:974)
в
org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:866)
в javax.servlet.http.HttpServlet.service (HttpServlet.java:634) в
org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:851)
в javax.servlet.http.HttpServlet.service (HttpServlet.java:741) в
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:231)
в
org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166)
в
org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:53)
в
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193)
в
org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166)
в
org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:199)
в
org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:96)
в
org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:502)
в
org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:140)
в
org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:81)
в
org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:651)
вorg.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:87)
в
org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:342)
в
org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:501)
в
org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66)
в
org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:754)
в
org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1376)
в
org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49)
в
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149)
в
java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624)
в
org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61)
at java.lang.Thread.run (Thread.java:748)
Почему Spring не вводит bean-компонент sessionFactory?
редактирование:
Добавление кода контроллера для запроса
@Controller
@RequestMapping("/customer")
public class CustomerController
{
@RequestMapping("/customerAddForm")
public String showAddCustomerForm(Model model)
{
model.addAttribute("customer", new Customer());
System.out.println("Inside showAddCustomerForm method");
return "customer-add-form";
}
@RequestMapping("/list")
public String listCustomers(Model model)
{
List<Customer> customers = new ArrayList<>();
new CustomerDAOImpl().testMethod();
model.addAllAttributes(customers);
return "list-customers";
}
@RequestMapping("/proccessAddForm")
public void proccessAddForm(@ModelAttribute("customer")Customer customer)
{
System.out.println("Inside proccessAddForm method, customer: " + customer.toString());
}
}