简体   繁体   English

Spring和Hibernate中的Session Factory

[英]Session Factory in Spring and Hibernate

I'm new to Spring MVC and Hibernate and I'm having a problem with my session configurations. 我是Spring MVC和Hibernate的新手,我的会话配置有问题。 I have done this by using the hibernate. 我已经通过使用休眠来做到这一点。 What I want to do now is that the sessionFactory will be autowired in the DAO. 我现在想做的是sessionFactory将在DAO中自动装配。

This is the application-context.xml ----------------------------------------------------------------------------------------- 这是application-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:beans="http://www.springframework.org/schema/beans"
      xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">

      <!-- Enable @Controller annotation support -->
      <mvc:annotation-driven />
     <mvc:default-servlet-handler/>
      <!-- Map simple view name such as "test" into /WEB-INF/test.jsp -->
      <beans:bean   class="org.springframework.web.servlet.view.InternalResourceViewResolver">      
            <beans:property name="prefix" value="/jsp" />       
            <beans:property name="suffix" value=".jsp" />   
      </beans:bean>

      <!-- Scan classpath for annotations (eg: @Service, @Repository etc) -->
      <context:component-scan base-package="com.nutsaboutcandywebproject.controller"/>

      <!-- JDBC Data Source. It is assumed you have MySQL running on localhost port 3306 with 
           username root and blank password. Change below if it's not the case -->
      <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db_nutsaboutcandy"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
        <property name="validationQuery" value="SELECT 1"/>
      </bean>

      <!-- Hibernate Session Factory -->
      <bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="packagesToScan">
           <list>
                <value>com.nutsaboutcandywebproject.model</value>
            </list>
        </property>
        <property name="hibernateProperties">
          <value>   
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
          </value>
        </property>
      </bean>

        <!-- Hibernate Transaction Manager -->
      <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory"/>
      </bean> 

      <!-- Activates annotation based transaction management -->
      <tx:annotation-driven transaction-manager="transactionManager"/> 

    </beans>    

This is the full stacktrace. 这是完整的堆栈跟踪。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shoppingCartController' defined in file [C:\Users\Jeremy Marvin\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\NutsAboutCandyWebProject\WEB-INF\classes\com\nutsaboutcandywebproject\controller\ShoppingCartController.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.nutsaboutcandywebproject.controller.ShoppingCartController]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1076)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1279)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1192)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.nutsaboutcandywebproject.controller.ShoppingCartController]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069)
    ... 34 more
Caused by: java.lang.NullPointerException
    at com.nutsaboutcandywebproject.dao.SQLProductsDataAccess.getCurrentSession(SQLProductsDataAccess.java:24)
    at com.nutsaboutcandywebproject.dao.SQLProductsDataAccess.getInventory(SQLProductsDataAccess.java:35)
    at com.nutsaboutcandywebproject.service.ServiceFacadeImpl.getAllProducts(ServiceFacadeImpl.java:140)
    at com.nutsaboutcandywebproject.controller.ShoppingCartController.<init>(ShoppingCartController.java:35)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 36 more

Apr 04, 2014 1:30:44 AM org.apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shoppingCartController' defined in file [C:\Users\Jeremy Marvin\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\NutsAboutCandyWebProject\WEB-INF\classes\com\nutsaboutcandywebproject\controller\ShoppingCartController.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.nutsaboutcandywebproject.controller.ShoppingCartController]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1076)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1279)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1192)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.nutsaboutcandywebproject.controller.ShoppingCartController]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069)
    ... 34 more
Caused by: java.lang.NullPointerException
    at com.nutsaboutcandywebproject.dao.SQLProductsDataAccess.getCurrentSession(SQLProductsDataAccess.java:24)
    at com.nutsaboutcandywebproject.dao.SQLProductsDataAccess.getInventory(SQLProductsDataAccess.java:35)
    at com.nutsaboutcandywebproject.service.ServiceFacadeImpl.getAllProducts(ServiceFacadeImpl.java:140)
    at com.nutsaboutcandywebproject.controller.ShoppingCartController.<init>(ShoppingCartController.java:35)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 36 more

Apr 04, 2014 1:30:44 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet appServlet
java.lang.NullPointerException
    at com.nutsaboutcandywebproject.dao.SQLProductsDataAccess.getCurrentSession(SQLProductsDataAccess.java:24)
    at com.nutsaboutcandywebproject.dao.SQLProductsDataAccess.getInventory(SQLProductsDataAccess.java:35)
    at com.nutsaboutcandywebproject.service.ServiceFacadeImpl.getAllProducts(ServiceFacadeImpl.java:140)
    at com.nutsaboutcandywebproject.controller.ShoppingCartController.<init>(ShoppingCartController.java:35)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1279)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1192)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

This is the code for the DAO 这是DAO的代码

package com.nutsaboutcandywebproject.dao;

import java.util.List;

import javax.transaction.Transactional;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;

import com.nutsaboutcandywebproject.model.Category;
import com.nutsaboutcandywebproject.model.Inventory;
import com.nutsaboutcandywebproject.model.Product;
import com.nutsaboutcandywebproject.model.ProductTypes;

public class SQLProductsDataAccess implements IProductsDataAccess {

    @Autowired
    SessionFactory sessionFactory;

     protected Session getCurrentSession(){
         return sessionFactory.getCurrentSession();
     }


    public Inventory getInventory()
    {

        Session session = getCurrentSession();
        Transaction transaction = session.beginTransaction();

        String sqlQuery = "from Product";
        Query query = session.createQuery(sqlQuery);
        System.out.println("Query created...");

        @SuppressWarnings("unchecked")
        List<Product> productsList = (List<Product>) query.list();

        Inventory inventory = new Inventory();
        inventory.setProducts(productsList);

        transaction.commit();

        session.close();
        return inventory;
    }

    public Product getProductById(Integer id) {

        Session session = getCurrentSession();
        Transaction transaction = session.beginTransaction();

        Query hqlQuery = session.createQuery("from Product WHERE id = :id");

        hqlQuery.setParameter("id", id);

        System.out.println("Query created...");

        List<?> productList = hqlQuery.list();
        Product product = (Product) productList.get(0);

        transaction.commit();

        session.close();

        return product;     

    }


    public List<Category> getCategoryName()
    {

        Session session = getCurrentSession();
        Transaction transaction = session.beginTransaction();

        String sqlQuery = "from Category";
        Query query = session.createQuery(sqlQuery);
        System.out.println("Query created...");

        List<Category> categoryList = query.list();

        transaction.commit();

        session.close();
        return categoryList;

    }


    @Override
    public Integer addStock(Integer id)
    {


        Product product = getProductById(id);

        int quantity = product.getQuantityInStock() + 1000;

        Session session = getCurrentSession();
        Transaction transaction = session.beginTransaction();

        String sqlQuery = "UPDATE Product set quantityInStock = :quantity"
                + " where id = :id";
        Query query = session.createQuery(sqlQuery);
        query.setParameter("quantity", quantity);
        query.setParameter("id", id);

        query.executeUpdate();

        transaction.commit();

        session.close();
        return quantity;

    }


    @Override
    public List<ProductTypes> getTypeName() {

        Session session = getCurrentSession();
        Transaction transaction = session.beginTransaction();

        String sqlQuery = "from ProductTypes";
        Query query = session.createQuery(sqlQuery);
        System.out.println("Query created...");

        List<ProductTypes> typeList = query.list();

        transaction.commit();

        session.close();
        return typeList;
    }


    @Override
    public void updateProduct(Integer updatedQuantity, Integer productId) {


        Session session = getCurrentSession();
        Transaction transaction = session.beginTransaction();

        String sqlQuery = "UPDATE Product set quantityInStock = :quantity"
                + " where id = :id";
        Query query = session.createQuery(sqlQuery);
        query.setParameter("quantity", updatedQuantity);
        query.setParameter("id", productId);
        System.out.println("Query created...");

        query.executeUpdate();

        transaction.commit();

        session.close();

    }


    @Override
    public Integer deleteProduct(Integer productId)
    {

        Session session = getCurrentSession();
        Transaction transaction = session.beginTransaction();
        Query query = session.createQuery("delete Product where id = :id");

        query.setParameter("id",productId);
        int result = query.executeUpdate();

        transaction.commit();

        session.close();

        return result;
    }



}

ShoppingCartController ShoppingCartController

package com.nutsaboutcandywebproject.controller;



@SessionAttributes(value = {"customerSession","cartSession"})
@Controller
public class ShoppingCartController {

    private ServiceFacade facade = new ServiceFacadeImpl();
    private NACExceptions exceptionsNAC = new NACExceptions();
    private List<Product> productsList = facade.getAllProducts();
    private List<Category> categoryList = facade.getCategory();
    private List<ProductTypes> typeList = facade.getType();
    private List<Sizes> sizeList = facade.getAllSizes();
    private List<ProductPriceMatrix> priceMatrixList = facade.getProductPriceMatrices();
    private List<String> exceptionList = new ArrayList<String>();

    @RequestMapping(value = "/cart", method = RequestMethod.POST)
      public String doShop(Model model, @RequestParam("smallSize") String[] small,
              @RequestParam("mediumSize") String[] medium ,@RequestParam("largeSize") String[] large) 
      {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        HttpSession session = attr.getRequest().getSession();

        List<ShoppingCart> cartList  = new ArrayList<ShoppingCart>();
        boolean isCartEmpty = true;

        if(session.getAttribute("cartSession")!=null){
            cartList = (List<ShoppingCart>) session.getAttribute("cartSession");
            isCartEmpty = false;
        }

        for(int index=0; index<productsList.size();index++){

            int numberOfSmall = 0;
            int numberOfMedium = 0;
            int numberOfLarge = 0;

            Integer productId = productsList.get(index).getId();

            Sizes size = priceMatrixList.get(index).getSize();
            Product product = facade.getSingleProduct(productId);


            try{
                exceptionsNAC.numberCheck(small[index]);
                exceptionsNAC.numberCheck(medium[index]);
                exceptionsNAC.numberCheck(large[index]);

                exceptionsNAC.checkValues(small[index]);
                exceptionsNAC.checkValues(medium[index]);
                exceptionsNAC.checkValues(large[index]);

                numberOfSmall = Integer.parseInt(small[index]);
                numberOfMedium = Integer.parseInt(medium[index]);
                numberOfLarge = Integer.parseInt(large[index]);

            }catch(ProductException e){
                exceptionList.add(e.getMessage());
            }


            User user = (User) session.getAttribute(("customerSession"));



            if(small[index] != null && numberOfSmall!=0){

                try {
                    if(exceptionsNAC.getRemainingQuantityInStock(50,numberOfSmall,product.getId())){            

                        ShoppingCart cart = new ShoppingCart(0,user,product,size,numberOfSmall);

                        cartList.add(cart);
                    }
                } catch (ProductException e) {
                    exceptionList.add(e.getMessage());
                }

            }

            if(medium[index] != null && numberOfMedium!=0){

                try {
                    if(exceptionsNAC.getRemainingQuantityInStock(100,numberOfMedium,product.getId())){

                        ShoppingCart cart = new ShoppingCart(0,user,product,size,numberOfMedium);

                        cartList.add(cart);
                    }
                } catch (ProductException e) {
                    exceptionList.add(e.getMessage());
                }


            }


            if(large[index] != null && numberOfLarge!=0){

                try {
                    if(exceptionsNAC.getRemainingQuantityInStock(150,numberOfLarge,product.getId())){
                        ShoppingCart cart = new ShoppingCart(0,user,product,size,numberOfLarge);

                        cartList.add(cart);
                    }
                } catch (ProductException e) {
                    exceptionList.add(e.getMessage());
                }

            }

        }

        if(isCartEmpty){
            session.setAttribute("cartSession", cartList);
        }

        model.addAttribute("cartSession", cartList);
        model.addAttribute("productsList", productsList);
        model.addAttribute("categoryList", categoryList);
        model.addAttribute("typeList", typeList);
        model.addAttribute("sizeList", sizeList);
        model.addAttribute("priceMatrixList", priceMatrixList);
        model.addAttribute("exception", exceptionList);

        return "/ShoppingCart";
     }




}

You are missing "dao" package in your component-scan config: 您在component-scan配置中缺少“ dao”包:

<context:component-scan base-package="com.nutsaboutcandywebproject.controller"/>
<context:component-scan base-package="com.nutsaboutcandywebproject.dao"/>

Also, DAO class must have @Repository annotation in order to use it as an autowired component. 此外,DAO类必须具有@Repository批注,才能将其用作自动装配的组件。

Your DAO and service objects need to be beans under Spring control. 您的DAO和服务对象必须是受Spring控制的bean。 By instantiating them like this: 通过这样实例化它们:

private ServiceFacade facade = new ServiceFacadeImpl();

Spring never gets to inject your dependencies and wire everything up, hence the NPE . Spring永远不会注入您的依赖项并将所有内容联系起来,因此就是NPE Add the following to your XML file 将以下内容添加到您的XML文件中

<context:component-scan base-package="com.nutsaboutcandywebproject.dao"/>
<context:component-scan base-package="com.nutsaboutcandywebproject.service"/>

and make sure your DAO is marked with @Repository or @Component , and your services as @Service or @Component . 并确保您的DAO被标记为@Repository@Component ,并且您的服务被标记为@Service@Component And change the instantiation of facade to 并将facade的实例化为

@Autowired
private ServiceFacade facade;

Since there was no scan for the DAO package, you almost certainly have to do the same in ServiceFacadeImpl and its IProductsDataAccess field. 由于没有扫描DAO包,因此几乎可以肯定,您必须在ServiceFacadeImpl及其IProductsDataAccess字段中执行相同的IProductsDataAccess

Update : Besides this, you're accessing beans which haven't been initialised yet, eg 更新 :除此之外,您还访问尚未初始化的bean,例如

private List<Product> productsList = facade.getAllProducts();

At that point in time, ie during object instantiation, Spring hasn't finished creating your DAOs, Hibernate session factory, etc. You can only access these beans and set your fields when Spring has finished initialising and injecting the dependencies. 在那个时间点,即在对象实例化期间,Spring尚未完成创建DAO,Hibernate会话工厂等的工作。只有在Spring完成初始化和注入依赖关系后,您才能访问这些bean并设置字段。 To do that, put the code in an initialisation method marked with @PostConstruct : 为此,将代码放入标有@PostConstruct的初始化方法中:

@Controller
public class ShoppingCartController {

    @Autowired
    private ServiceFacade facade;;
    private NACExceptions exceptionsNAC = new NACExceptions();
    private List<Product> productsList;
    private List<Category> categoryList;
    private List<ProductTypes> typeList;
    private List<Sizes> sizeList;
    private List<ProductPriceMatrix> priceMatrixList;
    private List<String> exceptionList = new ArrayList<String>();

    @PostConstruct
    public void someInitializationMethod() {

        productsList = facade.getAllProducts();
        categoryList = facade.getCategory();
        typeList = facade.getType();
        sizeList = facade.getAllSizes();
        priceMatrixList = facade.getProductPriceMatrices();
    }
       ....

Add few more lines like this - in order to initiate the bean along with the datasource 再添加几行这样的命令-以便与数据源一起启动bean

<bean id="shoppingCartController" class="point.it.to.implementation.class">
    <property name="mySessionFactory" ref="mySessionFactory"/>
</bean>

You can even try using @Autowired annotation, by simplying creating the setter method for it. 您甚至可以尝试通过简单地为其创建setter方法来使用@Autowired注释。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM