sessionFactory bean:使用setter注入时出现空指针异常

时间:2013-12-20 12:38:24

标签: java mysql spring hibernate struts2

我得到空指针异常。我猜,二传手注射不起作用。我试图查看服务器日志但无法找到根本原因。 任何帮助将不胜感激。

applicationContext.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: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.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

        <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

        <!-- Database Configuration -->

    <import resource="DataSource.xml"/>
    <import resource="HibernateSessionFactory.xml"/>

    <!-- Beans Declaration -->
    <import resource="UsersBean.xml"/>

</beans>

DataSource.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/test;create=true" />
    <property name="username" value="root" />
    <property name="password" value="deflection" />
  </bean>

</beans>

UsersBean.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">    


        <context:annotation-config/>
    <bean id="mainAction" class="com.riteshsangwan.integration.MainAction">

    </bean>
</beans>

ModelClass:

package com.riteshsangwan.integration;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class ModelClass implements Serializable {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private long mid;
    private String name;
    private String email;

    public long getMid() {
        return mid;
    }

    public void setMid(long mid) {
        this.mid = mid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


}

MainAction.java

package com.riteshsangwan.integration;

import com.opensymphony.xwork2.ActionSupport;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MainAction extends ActionSupport
{
    @Autowired
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public String execute(){
        ModelClass m=new ModelClass();
        m.setName("Ritesh");
        m.setEmail("sangwan.ritesh@yahoo.in");
        Session s=sessionFactory.openSession();
        s.beginTransaction();
        s.save(m);
        s.getTransaction().commit();
        s.close();
        return SUCCESS;
    }
}

编辑:

HibernateSessionFactory.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<!-- Hibernate session factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" scope="singleton">

    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>
    <property name="packagesToScan" value="com.riteshsangwan.integration" />

    <property name="hibernateProperties">
       <props>
         <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
         <prop key="hibernate.show_sql">true</prop>

       </props>
    </property>

    </bean>
</beans>

pom.xml

<dependencies>
    <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.16</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.2.7.SP1</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.2.7.SP1</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
     </dependencies>

struts.xml

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="main" class="com.riteshsangwan.integration.MainAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

1 个答案:

答案 0 :(得分:0)

至于你的动作bean由spring管理

<constant name="struts.objectFactory" value="spring" />

默认情况下在spring插件的struts-plugin.xml中使用。

动作配置中的

使用bean id作为class属性

的值
<action name="main" class="mainAction">

就使用Spring注释而言,包含在spring config

<context:component-scan base-package="com.riteshsangwan.integration"/>

还要确保部署了Struts spring plugin。将以下依赖项添加到pom.xml

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>2.3.16</version>
</dependency>

您可以找到here的示例的详细说明。

xsd架构的版本与pom.xml中的版本不同,您应该将spring config更新为您使用的版本。

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

适用于3.2版本。