在练习SSM框架的时候遇到了这样的问题:在controller层发现了service包中有空指针异常,于是步步推进。
首先我们先来看最终结果
@Service("empService")
public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
public List<Employee> getAll() {
return employeeMapper.selectByExample(new EmployeeExample());
}
@Test
public void test(){
// System.out.println(getAll());
System.out.println(employeeMapper);
}
}
最终打印结果就是null,也就是说我这里的employeeMapper并没有注入任何数据
接下来是我的spring配置文件
<context:component-scan base-package="com.dzy">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定mybatis全局配置文件位置-->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="dataSource" ref="datasource"></property>
<!-- 指定mybatis中所有mapper文件位置-->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
<!-- 配置扫描器 将mybatis接口的实现加入到spring的IOC容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描所有dao接口的实现,加入到IOC容器中-->
<property name="basePackage" value="com.dzy.dao"/>
</bean>
其他的配置部分应该是没有问题,然后就是我的mybatis配置文件代码
<configuration>
<!--加载日志文件-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.dzy.domain"/>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- <property name="dialect" value="mysql"/>-->
</plugin>
</plugins>
<mappers>
<!-- <package name="mapper/*.xml"/>-->
<mapper class="mapper/EmployeeMapper.xml"/>
<mapper resource="mapper/DepartmentMapper.xml"/>
</mappers>
</configuration>
最后的mappers标签是否加上对最终结果都没有影响(改正:需要注释掉)。
然后是我的包整体结构(这里我使用了mybatis逆向工程创建了mapper和dao层相关接口)
理论上来说是没有问题的,因为我在测试类中能够得到employeeMapper的数据(测试代码如下)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class MapperTest {
@Autowired
EmployeeMapper employeeMapper;
@Autowired
SqlSession sqlSession;
@Test
public void test2(){
// 这样子就不是null。。。
System.out.println(employeeMapper);
}
}
然后看了很多大神的说法,也没有效果,目前大部分人的说法是mapper文件没有关系,是service层出现问题????
求debug。。。