这是我的第一个mybatis spring mvc应用程序使用spring 3.2.4,mybatis-spring-1.2.1
当我尝试拨打我的网络服务时,我收到错误::
org.springframework.web.util.NestedServletException: Request processing failed;
nested exception is org.apache.ibatis.binding.BindingException: Invalid bound
statement (not found):
org.mydomain.formulary.drugmaster.dao.DrugMasterDao.getDrugsWithAlert
我必须遗漏一些明显的东西。 谢谢你的帮助
以下是我的相关文件: 的的applicationContext.xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="formularyDb" />
<property name="configLocation" value="file:/web/sites/drugformulary-spring/config/mybatis-config.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.mydomain.formulary.mappers" />
</bean>
<bean id="DrugMasterDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mydomain.formulary.drugmaster.dao.DrugMasterDao" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
映射器文件 - &gt; /classes/org/mydomain/formulary/mappers/drugmasterDao.xml
<mapper namespace="org.mydomain.formulary.drugmaster.dao.DrugMasterDao">
<select id="getDrugsWithAlert" parameterType="int" resultType="org.mydomain.formulary.drug_master.model.DrugMasters">
Select drug_id,drug_name,drug_alert_date,drug_alert_source, rownum
from (select drug_id,drug_name,to_char(drug_alert_datetime,'MM/DD/YYYY') as drug_alert_date ,drug_alert_source, rownum
from drug_master
where drug_status ='A' and length(drug_alert) > 0
order by drug_alert_datetime DESC )
where
<if test="_parameter != null">
rownum < #{count}
</if>
</select>
</mapper>
映射器文件 - &gt; /classes/org/mydomain/formulary/drugmaster/dao/DrugMasterDao.java
public interface DrugMasterDao {
public List<DrugMasters> getDrugsWithAlert(int count);
}
控制器文件 - &gt; /classes/org/mydomain/formulary/drugmaster/controller/DrugMasterController.java
@Controller
public class DrugMasterController {
@Autowired
DrugMasterService drugMasterService;
@RequestMapping(value = "/drugmaster/withalerts/count/{count}", method = RequestMethod.GET)
public String withAlerts(ModelMap model, @PathVariable int count) {
List<DrugMasters> drugs = drugMasterService.getDrugsWithAlert(count);
return null/*for now*/;
}
}
服务文件 - &gt; /classes/org/mydomain/formulary/drugmaster/service/DrugMasterServiceImpl.java
@Service
public class DrugMasterServiceImpl implements DrugMasterService {
@Autowired
DrugMasterDao drugMasterDao;
public List<DrugMasters> getDrugsWithAlert(int count){
return drugMasterDao.getDrugsWithAlert(count);
}
}
mybatis-configfile - &gt;
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="lazyLoadingEnabled" value="false" />
</settings>
</configuration>
答案 0 :(得分:23)
我在查找错误时搜索了这个答案。它实际上与OP的问题无关,但例外是相同的,这个问题在谷歌中非常明显。
在我的情况下,我忘记更改映射器名称空间
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
bin=${DIR}/../
lib=${DIR}/../../lib
echo '
{
"type" : "jdbc",
"jdbc" : {
"schedule" : "0 0/1 * 1/1 * ? *",
"url" : "jdbc:mysql://localhost:3306/mydb",
"user" : "",
"password" : "",
"elasticsearch" : {
"cluster" : "elasticsearch",
"host" : "localhost",
"port" : 9300
},
"sql" : [
{
"statement" : "/var/test.sql"
}
],
"index" : "myindex",
"type" : "mytype"
}
} ' | java \
-cp "${lib}/*" \
-Dlog4j.configurationFile=${bin}/log4j2.xml \
org.xbib.tools.Runner \
org.xbib.tools.JDBCImporter
导致了同样的问题。
答案 1 :(得分:5)
在阅读此页面中的配置后,我遇到了同样的问题。 https://mybatis.github.io/spring/mappers.html#scan
我看到我的配置是正确的。所以调试我的应用程序发现我的* mappers.xml文件不在路径中。期望一定是。
我在maven项目的同一个文件夹src“java”中有XML文件。所以当我构建我的应用程序时,文件不会复制到classes文件夹。所以我必须将xml文件移动到文件夹“resources”。并解决问题。
答案 2 :(得分:4)
因为你的xml没有在mybatis中加载, MapperScannerConfigurer 只扫描界面,而不是xml。 有两种方式:
<mappers>
<mapper resource="org/mydomain/formulary/mappers/drugmasterDao.xml"/>
</mappers>
或
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:org/mydomain/**/*.xml"/>
</bean>
答案 3 :(得分:2)
我使用solution of Giovanni Perea的变体解决了同样的问题(谢谢)。我将.xml映射器文件放在与.java映射文件相同的文件夹中,并使用maven和maven-resources-plugin。
在我的解决方案中,我在maven-resources-plugin中添加了一个执行程序,用于将所有.xml映射文件复制到正确的位置(.class映射文件的相同文件夹):
<execution>
<id>copy-mappers-xml</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/com/myapplication/mapper</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/java/com/myapplication/mapper/</directory>
<filtering>false</filtering>
<includes>
<include>*.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
maven-resources-plugin的更多示例:Including and excluding files and directories
如果您不使用maven-resources-plugin,请参阅: https://stackoverflow.com/a/12446666/2473158
答案 4 :(得分:2)
很可能是java方法名称和XML块名称不匹配
e.g mapper.getUser()
<select id="getUsee" resultMap="student">
...........
<>
getUser明显不同于getUsee
答案 5 :(得分:2)
我的spring-boot mybatis应用程序有类似的问题。 问题是mybatis找不到配置文件。添加后
mybatis.config-location=classpath:mybatis-config.xml
在application.properties文件中,问题得到了解决。看起来问题总是围绕配置文件/映射器文件和语句名称。
答案 6 :(得分:1)
在我的情况下,它是mapper xml语句的id中的拼写错误,例如
<select id="getDtaa" resultType="Data">
List<T> getData()
将XML中的id更改为正确的函数名称后,就可以了。
答案 7 :(得分:1)
除了上面提到的@Dariusz之外,我还忘记添加映射器位置。
<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/>
答案 8 :(得分:1)
将mapper / drugmasterDao.xml重命名为mapper / DrugMasterDao.xml,该名称必须与* Dao.java文件名匹配,否则会抛出错误 要么 我们必须明确地创建Ibatismapping.xml并在那里添加mapper配置
答案 9 :(得分:1)
在spring配置中,以xml方式为例,确保mapper.xml文件位于指定为名为mapperLocations
的属性值的位置。有一次我在mappers / anotherfolder / * .xml。这会导致痛苦。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="somepackage.model"/>
<property name="mapperLocations" value="classpath*:mappers/*.xml"/>
</bean>
答案 10 :(得分:0)
DrugMasters属性定义必须与drug_id,drug_name,drug_alert_date,drug_alert_source,rownum相关联。
答案 11 :(得分:0)
我在开发过程中也遇到过这个问题。 通常,如果你使用spring,myBatis等的xml配置文件,那么这个问题主要是由你的xml配置文件中的一些错误引起的。
Dariusz最投票的答案表明myBatis xml配置文件中可能存在一些问题,而在我的情况下,我发现spring xml配置文件中的问题也可能导致此问题。
在这篇文章的情况下,在applicationContext.xml(应该是Spring的配置文件)中,我们可以看到MapperScannerConfigurer的basePackage配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.mydomain.formulary.mappers" />
</bean>
因此,如果此属性的值错误(包名称不正确),则也会导致此问题。
答案 12 :(得分:0)
2要点
@MapperScan(com.xxx)
涵盖了所需的包。如果您使用的是注释,则<script>
var flag = 0;
function myFunction() {
var str = "Visit W3Schools!";
var n = str.search(/w3Schools/i);
if(flag){
document.getElementById("demo").innerHTML = myFunction.flag;
flag = 0;
} else {
document.getElementById("demo").innerHTML = myFunction.flag;
flag = 1;
}
}
</script>
必须位于已定义的路径中。答案 13 :(得分:0)
就我而言,我有多个DataSource
,应该为每个SessionFactory
设置mappler位置。
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(mysqlDataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/**/*Mapper.xml"));
答案 14 :(得分:0)
检查mapper中是否有任何重载方法。请尝试使用单独的名称。
答案 15 :(得分:0)
就我而言,在批注中使用查询时,我对批注中的XML被解释为XML的事实没有给予足够的重视。
如果有的话
@Select("select * from table where id <> 'blabla'")
<>
弄乱了XML。您需要将其放在CDATA部分中
@Select("select * from table where id <![CDATA[ <> ]]> 'blabla'")
答案 16 :(得分:0)
(可能有很多原因,我的案子有点稀奇古怪,很难发现,所以我想在这里添加答案,以防万一有人做与我相同的事情。)
在我的情况下,原因在IDEA
中,当为映射器文件创建多级包时,我输入mybatis.mapper
,该包仅创建一个单个目录,但其名称包含.
。
实际上我应该输入mybatis/mapper
一次创建多级目录。
在这两种情况下,该目录在IDEA的项目视图中显示为与mybatis.mapper
相同,因此花了我一段时间才弄清楚为什么...