//Located in com\src\myproject\services
package com.src.myproject.services;
public interface IMyService {
public boolean Method1();
}
//Located in com\src\myproject\services
package com.src.myproject.services;
public class MyService implements IMyService {
@Autowired
private TestMapper testMapper;
@Override
public boolean Method1() {
return gettestMapper().GetOrder(1); //Get null pointer exception as testMapper is null in debug mode
}
public TestMapper gettestMapper(){
return testMapper;
}
public void settestMapper(TestMapper testMapper){
this.testMapper=testMapper;
}
}
My mapper.java files are located under com\src\mappers
and corresponding mapper.xml is located under src\main\resources\com\src\myproject\mappers
My servelet-context.xml file is
<?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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<context:property-placeholder location="/WEB-INF/spring/jdbc.properties,/WEB-INF/spring/mybatis.properties" />
<context:component-scan base-package="com.src.myproject.controllers" />
<context:component-scan base-package="com.src.myproject.services" />
<!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Declare a datasource that has pooling capabilities -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" p:driverClass="${app.jdbc.driverClassName}"
p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}"
p:acquireIncrement="10" p:idleConnectionTestPeriod="60" p:maxPoolSize="100"
p:maxStatements="50" p:minPoolSize="10" />
<!-- Declare a transaction manager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
autowire="byName" />
<!-- define the SqlSessionFactory, notice that configLocation is not needed when you use MapperFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="${typeAliasesPackage}" />
</bean>
<!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.src.myproject.mappers" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans>
The autowiring in the services files is always null and gives null ref exception when I try to use any method from the mapper files via auto wire.
You should never instantiate Spring beans directly. It’s the container that is responsible for object creation. Thus in your controller, instead of:
Create such field:
Spring will discover it and assign proper value, which is an instance of
MyServicecreates beforehand for you.