java.lang.NullPointerException
at com.service.impl.UserServiceImpl.addUser(UserServiceImpl.java:39)
我的UserServiceImpl类
@Override
public int addUser(User user) {
return userMapper.addUser(user);
}
就这一个方法,后来我换了个不要参数的方法测试,发现报的还是同样的错误。都不知道错在哪里了
10 个解决方案
#1
是这个对象userMapper 为空吗 你先debug看看 如果是 检查下是否注入 以及是否有get/set方法
#2
你需要把xml配置贴出来,我们才能帮你看看,你这样的看不出来,spring集成的项目关键还是看xml配置
#3
我debug看了下,确实是空的,
#4
spring.xml
<task:annotation-driven/>
<mvc:annotation-driven />
<context:annotation-config/>
<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
<property name="locations">
<list>
<value>classpath*:jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${ds.initialSize}"/>
<property name="minIdle" value="${ds.minIdle}"/>
<property name="maxActive" value="${ds.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${ds.maxWait}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${ds.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${ds.minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="false"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat"/>
</bean>
<!-- mybatis文件配置,扫描所有mapper文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:dataSource-ref="dataSource"
p:configLocation="classpath*:mvc-dispatcher-servlet.xml"
p:mapperLocations="classpath*:mappers/*Mapper.xml"/>
<!-- spring与mybatis整合配置,扫描所有dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="com.dao, com.mybatis.dao"
p:sqlSessionFactoryBeanName="sqlSessionFactory"/>
<!-- 对dataSource 数据源进行事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- 事务管理 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="count*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<!-- 对其他方法 使用默认的事务管理 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 事务 aop 配置 -->
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* com.service..*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
<!-- 配置使Spring采用CGLIB代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 启用对事务注解的支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
mvc-servlet.xml
<mvc:annotation-driven />
<mvc:default-servlet-handler />
<context:annotation-config/>
<!--自动注入 -->
<context:component-scan base-package="com.controller" annotation-config="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="regex" expression="com.mybtis.dao.*Mapper"/>
</context:component-scan>
<context:component-scan base-package="com.service.impl" annotation-config="false"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<!-- <property name="suffix" value=".jsp"/> -->
</bean>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain; charset=UTF-8</value>
<value>application/json; charset=UTF-8</value>
<value>application/x-www-form-urlencoded; charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="zh_CN"/>
</bean>
<!-- 配置springMVC处理上传文件的信息 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10485760000"/>
<property name="maxInMemorySize" value="40960"/>
</bean>
</beans>
#5
我也遇到过,有说把@Autowired改成@Resource,也有说是没扫描到mapper.xml的,我的是因为不小心在Controller层new了一个ServiceImpl,然后mapper报空
#6
查看下配置文件吧 没设置好 还要查看get/set 饭方法,如何配置,你可以上网查一下
#7
确实就是userMapper 报空
#8
十分感谢 那个说new servicelmpl的 我也是这样mapper一直报空指针
#9
兄弟你现在是在controller层进行的单元测试还是service层啊?
我现在在service用junit3进行测试,,一直空指针
我现在在service用junit3进行测试,,一直空指针
#10
public class FaqServiceImplTest extends TestCase{
public static Test suite(){
return new TestSuite(FaqServiceImplTest.class);
}
public void testQueryByTerm(){
FaqServiceImpl impl = new FaqServiceImpl();
// DatagridResult result = impl.listcategory(null,null);
// System.out.println(result.getTotal());
List<Faqcontent> list = impl.queryByTerm("案");
// System.out.println(list.get(0));
assertNotNull(list.get(0));
}
}
public static Test suite(){
return new TestSuite(FaqServiceImplTest.class);
}
public void testQueryByTerm(){
FaqServiceImpl impl = new FaqServiceImpl();
// DatagridResult result = impl.listcategory(null,null);
// System.out.println(result.getTotal());
List<Faqcontent> list = impl.queryByTerm("案");
// System.out.println(list.get(0));
assertNotNull(list.get(0));
}
}
#1
是这个对象userMapper 为空吗 你先debug看看 如果是 检查下是否注入 以及是否有get/set方法
#2
你需要把xml配置贴出来,我们才能帮你看看,你这样的看不出来,spring集成的项目关键还是看xml配置
#3
我debug看了下,确实是空的,
#4
spring.xml
<task:annotation-driven/>
<mvc:annotation-driven />
<context:annotation-config/>
<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
<property name="locations">
<list>
<value>classpath*:jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${ds.initialSize}"/>
<property name="minIdle" value="${ds.minIdle}"/>
<property name="maxActive" value="${ds.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${ds.maxWait}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${ds.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${ds.minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="false"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat"/>
</bean>
<!-- mybatis文件配置,扫描所有mapper文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:dataSource-ref="dataSource"
p:configLocation="classpath*:mvc-dispatcher-servlet.xml"
p:mapperLocations="classpath*:mappers/*Mapper.xml"/>
<!-- spring与mybatis整合配置,扫描所有dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="com.dao, com.mybatis.dao"
p:sqlSessionFactoryBeanName="sqlSessionFactory"/>
<!-- 对dataSource 数据源进行事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- 事务管理 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="count*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<!-- 对其他方法 使用默认的事务管理 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 事务 aop 配置 -->
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* com.service..*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
<!-- 配置使Spring采用CGLIB代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 启用对事务注解的支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
mvc-servlet.xml
<mvc:annotation-driven />
<mvc:default-servlet-handler />
<context:annotation-config/>
<!--自动注入 -->
<context:component-scan base-package="com.controller" annotation-config="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="regex" expression="com.mybtis.dao.*Mapper"/>
</context:component-scan>
<context:component-scan base-package="com.service.impl" annotation-config="false"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<!-- <property name="suffix" value=".jsp"/> -->
</bean>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain; charset=UTF-8</value>
<value>application/json; charset=UTF-8</value>
<value>application/x-www-form-urlencoded; charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="zh_CN"/>
</bean>
<!-- 配置springMVC处理上传文件的信息 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10485760000"/>
<property name="maxInMemorySize" value="40960"/>
</bean>
</beans>
#5
我也遇到过,有说把@Autowired改成@Resource,也有说是没扫描到mapper.xml的,我的是因为不小心在Controller层new了一个ServiceImpl,然后mapper报空
#6
查看下配置文件吧 没设置好 还要查看get/set 饭方法,如何配置,你可以上网查一下
#7
确实就是userMapper 报空
#8
十分感谢 那个说new servicelmpl的 我也是这样mapper一直报空指针
#9
兄弟你现在是在controller层进行的单元测试还是service层啊?
我现在在service用junit3进行测试,,一直空指针
我现在在service用junit3进行测试,,一直空指针
#10
public class FaqServiceImplTest extends TestCase{
public static Test suite(){
return new TestSuite(FaqServiceImplTest.class);
}
public void testQueryByTerm(){
FaqServiceImpl impl = new FaqServiceImpl();
// DatagridResult result = impl.listcategory(null,null);
// System.out.println(result.getTotal());
List<Faqcontent> list = impl.queryByTerm("案");
// System.out.println(list.get(0));
assertNotNull(list.get(0));
}
}
public static Test suite(){
return new TestSuite(FaqServiceImplTest.class);
}
public void testQueryByTerm(){
FaqServiceImpl impl = new FaqServiceImpl();
// DatagridResult result = impl.listcategory(null,null);
// System.out.println(result.getTotal());
List<Faqcontent> list = impl.queryByTerm("案");
// System.out.println(list.get(0));
assertNotNull(list.get(0));
}
}