我的demo是用spring+ibatis做的,Test类是入口,我运行时就出现空指针异常,不知道为什么
可能注入不了
请大侠解答!!!下面是代码:
Level.java是一个表的映射类,有levelid,levelname,description这些属性,还有get,set方法
1>,Level.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Level">
<typeAlias alias="level" type="lingo.bean.Level" />
<select id="getLevel" parameterClass="lingo.bean.Level"
resultClass="lingo.bean.Level">
<![CDATA[ select levelid,levelname,description from level where levelid = #levelid# ]]>
</select>
<select id="getAllLevel" resultClass="lingo.bean.Level" parameterClass="lingo.bean.Level">
<![CDATA[ select levelid,levelname,description from level ]]>
</select>
<update id="updateLevel" parameterClass="level">
<![CDATA[ UPDATE level SET levelname=#levelname#, description=#description# WHERE levelid = #levelid# ]]>
</update>
<insert id="insertLevel" parameterClass="level">
INSERT INTO level ( levelid, levelname,description) VALUES ( #levelid#, #levelname#,#description# )</insert>
<delete id="deleteLevel" parameterClass="java.lang.String">
delete from level where levelid=#levelid#
</delete>
</sqlMap>2>,SqlMapConfig.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
lazyLoadingEnabled="true"
enhancementEnabled="true"
maxSessions="64"
maxTransactions="8"
maxRequests="128"
useStatementNamespaces="true"/><transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/lingo" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="root" />
<property name="Pool.MaximumActiveConnections" value="10" />
<property name="Pool.MaximumIdleConnections" value="5" />
<property name="Pool.TimeToWait" value="500" />
</dataSource>
</transactionManager>
<sqlMap resource="lingo/bean/Level.xml"/></sqlMapConfig>下面是spring的配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--配置连接数据库的基本信息-->
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/lingo</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<!-- <bean id="sqlMap" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:lingo/bean/SqlMapConfig.xml</value>
</property>
<property name="dataSource" ref="dataSource"/>
</bean> -->
<!-- ibatis工厂 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:lingo/bean/SqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 数据连接事务 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 拦截事务的方法设置 -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 拦截事务Beans设置-->
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Impl</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<!-- 此处增加新的Interceptor -->
</list>
</property>
</bean>
<!-- 通知器,用它来对属性值进行处理 -->
<bean
class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor"
ref="transactionInterceptor" />
</bean>
<bean id="test" class="lingo.dao.TestIOC">
</bean>
<!-- ibatisDAO实现类 -->
<bean id="levelDaoImpl" class="lingo.dao.LevelDaoImpl">
<property name="sqlMapClient" ref="sqlMapClient"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 处理业务逻辑的类 -->
<bean id="servletBus" class="lingo.module.ServletTest">
<property name="levelDao" ref="levelDaoImpl"/>
</bean>
<!--/////////////////// -->
</beans>
下面是dao层
ISprIbaDao是LevelDaoImpl的接口
3》,LevelDaoImpl.java
package lingo.dao;import java.util.List;import lingo.bean.Level;import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;import com.ibatis.sqlmap.client.SqlMapClient;public class LevelDaoImpl extends SqlMapClientDaoSupport implements ISprIbaDao { public LevelDaoImpl() {
super();
} public void deleteLevel(String id) {
// TODO Auto-generated method stub
} public List getLevel() {
SqlMapClientTemplate sct = this.getSqlMapClientTemplate();
System.out.println(sct+"sct"+this.getDataSource());
List list = sct.queryForList("Level.getAllLevel");
return list;
} public Level getOneLevel(int id) {
System.out.println("****************");
Level level = new Level();
level.setLevelid(id);
SqlMapClientTemplate sct = this.getSqlMapClientTemplate();
if (sct != null) { level = (Level) sct.queryForObject("Level.getLevel", level);
}
return null;
}
}
下面是MyFactoryBean.java
package lingo.dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class MyFactoryBean{
private static MyFactoryBean instance;
private ApplicationContext ctx = null; private MyFactoryBean(){
this.init();
} public static MyFactoryBean getInstance(){
if(instance == null){
instance = new MyFactoryBean();
}
return instance;
} public void init(){
ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
} public Object getBean(String id){
return ctx.getBean(id);
}
}
下面是Test.java
package lingo.dao;import lingo.bean.Level;public class Test{
public Level getLevel(){
System.out.println(this.getBeanFactory());
ISprIbaDao dao=((ISprIbaDao)getBeanFactory().getBean("levelDaoImpl"));
return dao.getOneLevel(24);
}
public MyFactoryBean getBeanFactory(){
return MyFactoryBean.getInstance();
}
public static void main(String[] args){
Test test = new Test();
Level level=test.getLevel();
System.out.println(level.getLevelname());
}
}
可能注入不了
请大侠解答!!!下面是代码:
Level.java是一个表的映射类,有levelid,levelname,description这些属性,还有get,set方法
1>,Level.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Level">
<typeAlias alias="level" type="lingo.bean.Level" />
<select id="getLevel" parameterClass="lingo.bean.Level"
resultClass="lingo.bean.Level">
<![CDATA[ select levelid,levelname,description from level where levelid = #levelid# ]]>
</select>
<select id="getAllLevel" resultClass="lingo.bean.Level" parameterClass="lingo.bean.Level">
<![CDATA[ select levelid,levelname,description from level ]]>
</select>
<update id="updateLevel" parameterClass="level">
<![CDATA[ UPDATE level SET levelname=#levelname#, description=#description# WHERE levelid = #levelid# ]]>
</update>
<insert id="insertLevel" parameterClass="level">
INSERT INTO level ( levelid, levelname,description) VALUES ( #levelid#, #levelname#,#description# )</insert>
<delete id="deleteLevel" parameterClass="java.lang.String">
delete from level where levelid=#levelid#
</delete>
</sqlMap>2>,SqlMapConfig.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
lazyLoadingEnabled="true"
enhancementEnabled="true"
maxSessions="64"
maxTransactions="8"
maxRequests="128"
useStatementNamespaces="true"/><transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/lingo" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="root" />
<property name="Pool.MaximumActiveConnections" value="10" />
<property name="Pool.MaximumIdleConnections" value="5" />
<property name="Pool.TimeToWait" value="500" />
</dataSource>
</transactionManager>
<sqlMap resource="lingo/bean/Level.xml"/></sqlMapConfig>下面是spring的配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--配置连接数据库的基本信息-->
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/lingo</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<!-- <bean id="sqlMap" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:lingo/bean/SqlMapConfig.xml</value>
</property>
<property name="dataSource" ref="dataSource"/>
</bean> -->
<!-- ibatis工厂 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:lingo/bean/SqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 数据连接事务 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 拦截事务的方法设置 -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 拦截事务Beans设置-->
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Impl</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<!-- 此处增加新的Interceptor -->
</list>
</property>
</bean>
<!-- 通知器,用它来对属性值进行处理 -->
<bean
class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor"
ref="transactionInterceptor" />
</bean>
<bean id="test" class="lingo.dao.TestIOC">
</bean>
<!-- ibatisDAO实现类 -->
<bean id="levelDaoImpl" class="lingo.dao.LevelDaoImpl">
<property name="sqlMapClient" ref="sqlMapClient"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 处理业务逻辑的类 -->
<bean id="servletBus" class="lingo.module.ServletTest">
<property name="levelDao" ref="levelDaoImpl"/>
</bean>
<!--/////////////////// -->
</beans>
下面是dao层
ISprIbaDao是LevelDaoImpl的接口
3》,LevelDaoImpl.java
package lingo.dao;import java.util.List;import lingo.bean.Level;import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;import com.ibatis.sqlmap.client.SqlMapClient;public class LevelDaoImpl extends SqlMapClientDaoSupport implements ISprIbaDao { public LevelDaoImpl() {
super();
} public void deleteLevel(String id) {
// TODO Auto-generated method stub
} public List getLevel() {
SqlMapClientTemplate sct = this.getSqlMapClientTemplate();
System.out.println(sct+"sct"+this.getDataSource());
List list = sct.queryForList("Level.getAllLevel");
return list;
} public Level getOneLevel(int id) {
System.out.println("****************");
Level level = new Level();
level.setLevelid(id);
SqlMapClientTemplate sct = this.getSqlMapClientTemplate();
if (sct != null) { level = (Level) sct.queryForObject("Level.getLevel", level);
}
return null;
}
}
下面是MyFactoryBean.java
package lingo.dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class MyFactoryBean{
private static MyFactoryBean instance;
private ApplicationContext ctx = null; private MyFactoryBean(){
this.init();
} public static MyFactoryBean getInstance(){
if(instance == null){
instance = new MyFactoryBean();
}
return instance;
} public void init(){
ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
} public Object getBean(String id){
return ctx.getBean(id);
}
}
下面是Test.java
package lingo.dao;import lingo.bean.Level;public class Test{
public Level getLevel(){
System.out.println(this.getBeanFactory());
ISprIbaDao dao=((ISprIbaDao)getBeanFactory().getBean("levelDaoImpl"));
return dao.getOneLevel(24);
}
public MyFactoryBean getBeanFactory(){
return MyFactoryBean.getInstance();
}
public static void main(String[] args){
Test test = new Test();
Level level=test.getLevel();
System.out.println(level.getLevelname());
}
}
2009-6-4 14:15:16 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@e5855a: display name [org.springframework.context.support.FileSystemXmlApplicationContext@e5855a]; startup date [Thu Jun 04 14:15:16 CST 2009]; root of context hierarchy
2009-6-4 14:15:16 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [E:\java\workspace\spribaext\src\applicationContext.xml]
2009-6-4 14:15:17 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
信息: Bean factory for application context [org.springframework.context.support.FileSystemXmlApplicationContext@e5855a]: org.springframework.beans.factory.support.DefaultListableBeanFactory@193a66f
2009-6-4 14:15:17 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
信息: Bean 'org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2009-6-4 14:15:17 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@193a66f: defining beans [dataSource,sqlMapClient,transactionManager,transactionInterceptor,org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator,org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor,test,levelDaoImpl,servletBus]; root of factory hierarchy
2009-6-4 14:15:17 org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
信息: Loaded JDBC driver: com.mysql.jdbc.Driver
构造方法
lingo.dao.LevelDaoImpl@1a85d38testestesst
lingo.dao.MyFactoryBean@8046f4
****************
Exception in thread "main" java.lang.NullPointerException
at lingo.dao.Test.main(Test.java:40)
at lingo.dao.Test.main(Test.java:40) 在Test.java的40行,你贴的源码里Test.java有40行吗?
我可以整个project都发给你看看
2009-6-4 14:23:04 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@e5855a: display name [org.springframework.context.support.FileSystemXmlApplicationContext@e5855a]; startup date [Thu Jun 04 14:23:04 CST 2009]; root of context hierarchy
2009-6-4 14:23:04 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [E:\java\workspace\spribaext\src\applicationContext.xml]
2009-6-4 14:23:05 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
信息: Bean factory for application context [org.springframework.context.support.FileSystemXmlApplicationContext@e5855a]: org.springframework.beans.factory.support.DefaultListableBeanFactory@193a66f
2009-6-4 14:23:05 org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
信息: Bean 'org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2009-6-4 14:23:05 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@193a66f: defining beans [dataSource,sqlMapClient,transactionManager,transactionInterceptor,org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator,org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor,test,levelDaoImpl,servletBus]; root of factory hierarchy
2009-6-4 14:23:05 org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
信息: Loaded JDBC driver: com.mysql.jdbc.Driver
lingo.dao.MyFactoryBean@16dfa45
****************
Exception in thread "main" java.lang.NullPointerException
at lingo.dao.Test.main(Test.java:40)