【发布时间】:2018-12-02 17:18:19
【问题描述】:
我正在编写一个非常简单的 crm Web 应用程序,但在我的一个 DAO 类中自动装配 hibernate sessionFactory bean 时遇到问题。我已经在网上搜索了几天,我很困惑,因为我的配置似乎反映了那些据说在网上工作的配置。在这个项目中,我不使用 xml。
web servlet 配置类
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("/");
}
}
spring 配置类
@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();
}
}
休眠配置文件
@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;
}
}
我正在尝试在这个 DAO 类中自动装配 sessionFactory,但是当我调用 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;
}
}
例外:
严重:Servlet.service() 用于 servlet [dispatcher] 在上下文中 路径 [/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(Native Method) 在 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) 在 java.lang.Thread.run(Thread.java:748)
为什么 Spring 不注入 sessionFactory bean?
编辑: 为每个请求添加控制器代码
@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());
}
}
【问题讨论】:
-
为什么需要再次使用setter设置sessionFactory?公共无效 setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } 请删除此代码并再次检查。
-
@AbhayJain 我删除了 setter 代码,但没有任何改变。仍然是 NullPointerException。
-
如果有,你能以正确的格式发布完整的堆栈跟踪吗?
-
@AbhayJain 抱歉格式化,我知道我本可以做得更好,但这是我迄今为止的第一篇文章。这是我拥有的完整堆栈跟踪。应用程序部署在 tomcat 上。我访问映射到方法的 url,该方法也从 CustomerDAOImpl 类调用提到的 testMethod()。然后我在浏览器中收到 http 500 错误,并且堆栈跟踪在 dao 类的第 20 行指向 NullPointerException。所以很明显 sessionFactory 对象当时是 null 并且依赖还没有被 spring 满足。不知道我还能提供什么信息。
标签: java spring hibernate autowired sessionfactory