求spring高手指点

说说笑笑 发布于 2010/07/28 14:00
阅读 672
收藏 2

为什么我这样整合SSH,spring2.5无法实例化SessionFactory

beans.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:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
            <aop:aspectj-autoproxy />
            <context:annotation-config />
            <context:component-scan base-package="com.ssh_rooms" />
            <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
             <property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
             <property name="url" value="jdbc:mysql://127.0.0.1:3306/mysql" />
             <property name="username" value="root" />
             <property name="password" value="123456" />
             <!-- 连接池启动时的初始值 -->
             <property name="initialSize" value="1" />
             <!-- 连接池最大值 -->
             <property name="maxActive" value="500" />
             <!-- 连接池最大空闲值,当经过一个高峰时间后,连接池可将用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
             <property name="maxIdle" value="2" />
             <!-- 连接池最小空闲值,当连接数量少于阙值时,连接池会去申请一些连接,以免洪峰时来不及申请 -->
             <property name="minIdle" value="1" />
            </bean>
           
            <!-- 配置hibernate(这里用到了二级缓存,需要配置ehcache.xml),
            这样就不需要hibernate.cfg.xml文件了 -->
            <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
             <property name="dataSource" ref="dataSource" />
             <property name="mappingResources">
              <list>
               <value>com/ssh_rooms/entity/Tenement.hbm.xml</value>
               <value>com/ssh_rooms/entity/Room.hbm.xml</value>
              </list>
             </property>
             <property name="hibernateProperties">
              <value>
               hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
               hibernate.hbm2ddl.auto=none
               hibernate.show_sql=true
               hibernate.format_sql=true
               hibernate.cache.use_second_level_cache=true
               hibernate.cache.use_query_cache=false
               hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
               <!-- 使用hibernate二级缓存
               hibernate.cache.use_second_level_cache=true;-->
               <!-- 不使用查询缓存
               hibernate.cache.use_query_cache=false;-->
              </value>
             </property>
            </bean>
           
            <!-- 事务管理器 -->
            <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
             <property name="sessionFactory" ref="sessionFactory"/>
            </bean>
           
            <!-- 采用注解的方式声明事务 -->
            <tx:annotation-driven transaction-manager="txManager" />
           
            <!-- 将Struts的Action交给Spring管理
            必须让Action在Spring配置文件的名字和struts-config.xml对应路径名相同
              而且还要在struts-config.xml配置一个控制器
             -->
</beans>

<!-- ======================分割线 ====================== -->

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
 xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
 <servlet-name>action</servlet-name>
 <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
 <init-param>
  <param-name>config</param-name>
  <param-value>/WEB-INF/struts-config.xml</param-value>
 </init-param>
 <init-param>
  <param-name>debug</param-name>
  <param-value>3</param-value>
 </init-param>
 <init-param>
  <param-name>detail</param-name>
  <param-value>3</param-value>
 </init-param>
 <load-on-startup>0</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>action</servlet-name>
 <url-pattern>*.do</url-pattern>
 </servlet-mapping>

  <!-- Spring提供的Struts中文参数乱码过滤器 -->
 <filter>
 <filter-name>encoding</filter-name>
 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 <init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
 </init-param>
 </filter>
 <filter-mapping>
 <filter-name>encoding</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>
 <!-- Hibernate延迟加载过滤器 -->
  <filter>
  <filter-name>openSessionInViewFilter</filter-name>
  <filter-class>
   org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
  </filter-class>
 </filter>
 <filter-mapping>
  <filter-name>openSessionInViewFilter</filter-name>
  <url-pattern>*.do</url-pattern>
 </filter-mapping>
 <!-- 指定spring配置文件 -->
 <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:beans.xml</param-value>
    </context-param>
    <!-- 对Spring容器实例化 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

<!-- ======================分割线 ====================== -->

数据库访问类

package com.ssh_rooms.dao.imp;

import java.util.*;

import javax.annotation.Resource;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ssh_rooms.dao.inf.TenementManager;
import com.ssh_rooms.entity.Tenement;

@Repository
@Transactional
public class TenementManagerImp implements TenementManager
{
 @Resource private SessionFactory sessionFactory;
  public Tenement login(String name, String password)
 {
  Tenement tene=null;
  String hql="from Tenement where name=? and password=?";
  try
  {
   System.out.println(sessionFactory==null);//后台输出结果是true

  //这里抛出空指针异常
   tene=(Tenement)sessionFactory.getCurrentSession().createQuery(hql).setParameter(0, name).setParameter(1, password).uniqueResult();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return tene;
 }
}

<!-- ======================分割线 ====================== -->

对应Struts的Action类

package com.ssh_rooms.action;

import java.io.*;
import java.net.*;
import java.util.*;

import javax.servlet.http.*;

import org.apache.struts.action.*;
import org.springframework.stereotype.Controller;

import com.ssh_rooms.dao.imp.TenementManagerImp;
import com.ssh_rooms.dao.inf.TenementManager;
import com.ssh_rooms.entity.Tenement;

@Controller (value="/login")
public class LoginAction extends Action
{
 private static Properties config = new Properties();
 static
   {
     try
     {
       InputStream in = LoginAction.class.getClassLoader().getResourceAsStream("roommanager.properties");
       config.load(in);
       in.close();
     }catch(Exception e)
     {
       e.printStackTrace();
       throw new ExceptionInInitializerError();
     }
   }
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception
 {
  LoginForm loginForm=(LoginForm)form;
  String username=URLDecoder.decode(loginForm.getUsername(),"utf-8");
  System.out.println(username);
  String password=loginForm.getPassword();
  String rname=config.getProperty("rootname");
  String rpwd=config.getProperty("password");
  TenementManager tm=new TenementManagerImp();
  System.out.println(tm.login("123", "123"));//这里抛出空指针异常
  if(username.equals(rname)&&password.equals(rpwd))
  {
   //HttpSession session=request.getSession();
   //List<Tenement> tenes1=tm.getAllTenements();
   //session.setAttribute("tenes1", tenes1);
   return mapping.findForward("success_landlord");
  } 

  else
   return mapping.findForward("fail");
 }
}

问题到底出在哪里,求高手指点~!!!

加载中
0
答复哈
答复哈

TenementManager tm=new TenementManagerImp();

tm也应该是通过注入得来的

0
郑雨涵
郑雨涵

把出错信息贴上来

0
崔青山绿水

都没见用你使用 Spring的上下文环境。

0
说说笑笑

引用来自#4楼“崔青山绿水”的帖子

都没见用你使用 Spring的上下文环境。

我这里全部交给spring容器管理了

所以不需要手工编写获得spring上下文对象

0
说说笑笑

引用来自#2楼“答复哈”的帖子

TenementManager tm=new TenementManagerImp();

tm也应该是通过注入得来的

基于注解方式声明切面
使用注解的方式注入依赖对象并以自动扫描的方式将使用注解注入的Bean交给Spring容器管理

<aop:aspectj-autoproxy />
<context:annotation-config />
<context:component-scan base-package="com.ssh_rooms" />

TenementManager已经标上注解

@Repository
@Transactional



0
说说笑笑

引用来自#3楼“xiaojia2008”的帖子

把出错信息贴上来

 
java.lang.NullPointerException
 at com.ssh_rooms.dao.imp.TenementManagerImp.login(TenementManagerImp.java:89)
 at com.ssh_rooms.action.LoginAction.execute(LoginAction.java:44)

这就是错误信息

0
郑雨涵
郑雨涵

 TenementManager tm=new TenementManagerImp();

你这么做什么意思?这个应该注入进来.如果你手工创建实例,不是使用spring托管的实例,那么

这里

 @Resource private SessionFactory sessionFactory;
  public Tenement login(String name, String password) 

自然不能注入sessionFactory了。


0
说说笑笑

引用来自#8楼“xiaojia2008”的帖子

 TenementManager tm=new TenementManagerImp();

你这么做什么意思?这个应该注入进来.如果你手工创建实例,不是使用spring托管的实例,那么

这里

 @Resource private SessionFactory sessionFactory;
  public Tenement login(String name, String password) 

自然不能注入sessionFactory了。


 那我应该怎么做呢

求代码

0
a
a.mu

你先在配置文件里配置好你的DAO,再在public class TenementManagerImp用就可以了,

可以参与一下

@Repository("areaDao")
@Transactional
public class TenementManagerImp

这样,要先配置好areaDao,就能在你的*****Impl里用了

0
说说笑笑

问题解决了
AbstractApplicationContext actx=new ClassPathXmlApplicationContext("beans.xml");
  TenementManager tm=(TenementManager)actx.getBean("tenementManagerImp");
这样做就行了

返回顶部
顶部