我用hibernate+struts2+spring这三大框架做了个小例子,但是写完之后,启动服务器,没有问题,但是运行页面,页面上报空值中异常,说action中定义的userService是空值,我猜是spring没有自动创建对象,还是根本没有读取到application文件??各位大侠,帮帮,看看是什么问题??
application配置文件代码如下:
<!-- session -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>

<!-- dao -->
<bean id="UsersDAO" class="com.dao.UsersDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="DeptDAO" class="com.dao.DeptDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<!-- service -->
<bean id="UserService" class="com.service.UserService">
<property name="userdao" ref="UsersDAO"></property>
</bean>

<!-- action -->
<bean id="UserAction" class="com.action.UserAction">
<property name="userService" ref="UserService"></property>
</bean>

<!-- 事务 -->
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory">
</property>
</bean>
<!-- 事务属性 -->
<tx:advice id="mytx">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 织入 -->
<aop:config>
<aop:advisor advice-ref="mytx" pointcut="execution(* com.service.*.*(..))"/>
</aop:config>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">
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/classes/app*.xml</param-value>
 </context-param>
 <filter>
  <filter-name>session</filter-name>
  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
 </filter>
 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>session</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>
</web-app>

解决方案 »

  1.   

    spring里面的事务要放sessionFactory,你放的位置不对
      

  2.   

    后台没有错误,只是在页面上出现的错误,是在action中定义的userService对象为空.
    java.lang.NullPointerException
    com.action.UserAction.getAll(UserAction.java:34)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
      

  3.   

    spring事务里面放sessionFactory,位置不对,那应该放在哪里啊??
      

  4.   

    你的USEDAO有没有继承HIBERNATESUPORT这个类啊
      

  5.   

    dao类是通过myEclipse工具导spring的时候自动生成的
    public class UsersDAO extends HibernateDaoSupport {
    private static final Log log = LogFactory.getLog(UsersDAO.class);
    // property constants
    public static final String TNAME = "tname";
    public static final String TSEX = "tsex";
    public static final String TAGE = "tage";
    public static final String TPLACE = "tplace";
    public static final String TEMAIL = "temail";
    public static final String TPHONE = "tphone";
    public static final String TPICTURE = "tpicture"; protected void initDao() {
    // do nothing
    } public void save(Users transientInstance) {
    log.debug("saving Users instance");
    try {
    getHibernateTemplate().save(transientInstance);
    log.debug("save successful");
    } catch (RuntimeException re) {
    log.error("save failed", re);
    throw re;
    }
    } public void delete(Users persistentInstance) {
    log.debug("deleting Users instance");
    try {
    getHibernateTemplate().delete(persistentInstance);
    log.debug("delete successful");
    } catch (RuntimeException re) {
    log.error("delete failed", re);
    throw re;
    }
    } public Users findById(java.lang.Integer id) {
    log.debug("getting Users instance with id: " + id);
    try {
    Users instance = (Users) getHibernateTemplate().get(
    "com.pojo.Users", id);
    return instance;
    } catch (RuntimeException re) {
    log.error("get failed", re);
    throw re;
    }
    } public List findByExample(Users instance) {
    log.debug("finding Users instance by example");
    try {
    List results = getHibernateTemplate().findByExample(instance);
    log.debug("find by example successful, result size: "
    + results.size());
    return results;
    } catch (RuntimeException re) {
    log.error("find by example failed", re);
    throw re;
    }
    } public List findByProperty(String propertyName, Object value) {
    log.debug("finding Users instance with property: " + propertyName
    + ", value: " + value);
    try {
    String queryString = "from Users as model where model."
    + propertyName + "= ?";
    return getHibernateTemplate().find(queryString, value);
    } catch (RuntimeException re) {
    log.error("find by property name failed", re);
    throw re;
    }
    } public List findByTname(Object tname) {
    return findByProperty(TNAME, tname);
    } public List findByTsex(Object tsex) {
    return findByProperty(TSEX, tsex);
    } public List findByTage(Object tage) {
    return findByProperty(TAGE, tage);
    } public List findByTplace(Object tplace) {
    return findByProperty(TPLACE, tplace);
    } public List findByTemail(Object temail) {
    return findByProperty(TEMAIL, temail);
    } public List findByTphone(Object tphone) {
    return findByProperty(TPHONE, tphone);
    } public List findByTpicture(Object tpicture) {
    return findByProperty(TPICTURE, tpicture);
    } public List findAll() {
    log.debug("finding all Users instances");
    try {
    String queryString = "from Users";
    return getHibernateTemplate().find(queryString);
    } catch (RuntimeException re) {
    log.error("find all failed", re);
    throw re;
    }
    } public Users merge(Users detachedInstance) {
    log.debug("merging Users instance");
    try {
    Users result = (Users) getHibernateTemplate().merge(
    detachedInstance);
    log.debug("merge successful");
    return result;
    } catch (RuntimeException re) {
    log.error("merge failed", re);
    throw re;
    }
    } public void attachDirty(Users instance) {
    log.debug("attaching dirty Users instance");
    try {
    getHibernateTemplate().saveOrUpdate(instance);
    log.debug("attach successful");
    } catch (RuntimeException re) {
    log.error("attach failed", re);
    throw re;
    }
    } public void attachClean(Users instance) {
    log.debug("attaching clean Users instance");
    try {
    getHibernateTemplate().lock(instance, LockMode.NONE);
    log.debug("attach successful");
    } catch (RuntimeException re) {
    log.error("attach failed", re);
    throw re;
    }
    } public static UsersDAO getFromApplicationContext(ApplicationContext ctx) {
    return (UsersDAO) ctx.getBean("UsersDAO");
    }
    }
      

  6.   

    放个action类的代码,你在action类里有userService的注入(读取)吗?
      

  7.   

    public class UserAction extends ActionSupport { private UsersService userService;
    private List<Users> list; public List<Users> getList() {
    return list;
    } public void setList(List<Users> list) {
    this.list = list;
    } public UsersService getUserService() {
    return userService;
    } public void setUserService(UsersService userService) {
    this.userService = userService;
    } public String getAll() throws Exception {
    // TODO Auto-generated method stub
    this.list = userService.getAll();
    System.out.println("集合长度:"+this.list.size());
    for (int i = 0; i < this.list.size(); i++) {
    System.out.println("姓名:"+this.list.get(i).getTname());
    }
    return "main";
    } public String update() throws Exception { return "main";
    }
    }
      

  8.   

    lz
    context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/classes/app*.xml</param-value>
     </context-param>加载spring文件好像有点问题吧
    如果是放在src下  可以是这样   <param-value>classpath:application.xml</param-value>
    如果是放在WEB-INF下 那是这样 <param-value>/WEB-INF/application.xml</param-value>
    lz在去检查下启动时在控制台
    Initializing Spring root WebApplicationContext
    是否有这个。
      

  9.   

    现在解决了
    是导入hibernate的时候有个地方没有选上,所以有些配置文件也没有读取,
    现在可以了,谢谢各位的帮忙!