Spring扫面路径配置不全导致异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 的原因
运行Junit测试类
package cn.bgodata.x.zero.service; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import cn.bgodata.x.zero.core.model.Cube; import cn.bgodata.x.zero.core.model.Z0Dimension; import cn.bgodata.x.zero.dao.CubeDAO; import cn.bgodata.x.zero.dao.DimensionDAO; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath:spring/spring-dao.xml", "classpath:spring/spring-service.xml"}) public class ServiceTestClass { @Autowired private DimService dimService; @Autowired private CubeService cubeService; @Autowired private CubeDAO cubeDao; @Autowired private DimensionDAO dimDao; @Test public void TXtestTX() throws Exception { Cube c1 = new Cube(); c1.setWormholeId(80001); c1.setWormholeCode("great cube"); c1.setName("切片与切块Cube"); Z0Dimension dim = new Z0Dimension(); dim.setWormholeId(80999); dim.setWormholeCode("multi-dimensional domain: 维度"); dim.setName("行政划分"); dim.setCube(c1); dimService.saveDim(dim); cubeService.saveCube(c1, false); } }
抛出异常
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.bgodata.x.zero.service.DimService.save
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:196)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:44)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:59)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
at com.sun.proxy.$Proxy19.save(Unknown Source)
at cn.bgodata.x.zero.service.ServiceTestClass.TXtestTX(ServiceTestClass.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
检查service接口及实现、dao接口及实现、dimension-mapper.xml、cube-mapper.xml,以及源码和配置文件路径,皆无误
package cn.bgodata.x.zero.dao; import cn.bgodata.x.zero.core.model.Cube; public interface CubeDAO { public int save(Cube cube); }
package cn.bgodata.x.zero.dao; import java.util.List; import cn.bgodata.x.zero.core.model.Z0Dimension; public interface DimensionDAO { public List<Z0Dimension> loadAllDimensions(); public int saveDim(Z0Dimension dim); }
package cn.bgodata.x.zero.service; import cn.bgodata.x.zero.core.model.Cube; public interface CubeService { public void saveCube(Cube c, boolean throwExFlag); }
package cn.bgodata.x.zero.service; import cn.bgodata.x.zero.core.model.Z0Dimension; import cn.bgodata.x.zero.dao.DimensionDAO; public interface DimService { public void saveDim(Z0Dimension dimension); public DimensionDAO getDimensionDAO(); }
package cn.bgodata.x.zero.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import cn.bgodata.x.zero.core.model.Cube; import cn.bgodata.x.zero.dao.CubeDAO; import cn.bgodata.x.zero.service.CubeService; @Service public class CubeServiceImpl implements CubeService { @Autowired private CubeDAO cubeDao; // @Override public void saveCube(Cube c, boolean throwExFlag) { System.out.println("save cube count is [" + cubeDao.save(c) + "]"); if (throwExFlag) { throw new RuntimeException("test tx ..."); } } }
package cn.bgodata.x.zero.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import cn.bgodata.x.zero.core.model.Z0Dimension; import cn.bgodata.x.zero.dao.DimensionDAO; import cn.bgodata.x.zero.service.DimService; @Service public class DimServiceImpl implements DimService { @Autowired private DimensionDAO dimDao; // @Override public void saveDim(Z0Dimension dimension) { System.out.println("save dimension count is [" + dimDao.saveDim(dimension) + "]"); } @Override public DimensionDAO getDimensionDAO() { // TODO Auto-generated method stub return dimDao; } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.bgodata.x.zero.dao.CubeDAO"> <insert id="save" parameterType="Cube"> insert ignore into WORMHOLE_CUBE (wormhole_id, wormhole_code, name) values (#{wormholeId}, #{wormholeCode}, #{name}) </insert> </mapper>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.bgodata.x.zero.dao.DimensionDAO"> <select id="loadAllDimensions" resultType="Z0Dimension"> select wc.name 'cube.name', wc.wormhole_code 'cube.wormhole_code', wc.wormhole_id 'cube.wormhole_id', wd.name, wd.wormhole_code, wd.wormhole_id from WORMHOLE_CUBE wc inner join WORMHOLE_DIMENSION wd on wc.wormhole_id = wd.cube_id </select> <insert id="saveDim" parameterType="Z0Dimension"> insert ignore into WORMHOLE_DIMENSION (wormhole_id, wormhole_code, name, cube_id) values (#{wormholeId}, #{wormholeCode}, #{name}, #{cube.wormholeId}) </insert> </mapper>
导致问题的原因在 spring-dao.xml
spring-dao.xml中配置的DAO接口扫描路径不是完全包名(导致异常的原因)
修改 spring-dao.xml
将扫描路径配置为DAO接口所在包的全路径,问题解决。