为什么Mybatis映射器扫描器拾取错误的类

时间:2013-12-05 16:58:19

标签: spring mybatis

我使用Spring和Mybatis。我已经将它配置为在我的整个项目中扫描映射器,我认为它确定了一个映射器,因为它找到了一个引用java接口的XML文件。

但是今天这被证明是不正确的,因为我必须添加一个不是mapper类的新接口而Mybatis认为它是,所以由于这个错误导致我的应用程序出现问题:

映射的语句集合不包含com.blah.MyInterface.someMethod的值

com.blah.MyInterface只是一个简单的界面,我需要将其包含在Spring上下文中,所以我给了它@Component标签。这是错误的标签吗?这是混乱的来源吗?

我只需要创建这个接口,这样我就可以在一个可以放置@Transactional标签的地方使用代理包装我的数据库调用,因为当它在我的Controller方法中时,Spring会忽略它。

示例代码

package com.blah.something;

@Component public interface MyInterface {

    public void someMethod( SomeObject obj) throws Exception; 
}


package com.blah.something;

public class MyImplementation implements MyInterface {

        @Transactional
        public void someMethod( SomeObject obj) throws Exception {
              ... do a whole bunch of stuff
        } 
}

我不希望这包含在MyBatis映射器中!

编辑:按要求添加了mybatis配置xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <setting name="lazyLoadingEnabled" value="false" />
        <setting name="defaultStatementTimeout" value="60"/>
    </settings>

    <typeAliases>
      <typeAlias alias="StripTrailingZerosBigDecimalTypeHandler" type="com.blah.typehandlers.StripTrailingZerosBigDecimalTypeHandler"/>
    </typeAliases>

</configuration>

这是我的spring xml配置中调用mybatis映射扫描器的部分:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.blah" />
</bean>

所以我将它设置为扫描整个项目,其中包括我上面的界面,但我无法想象它只是抓住每一个接口并将它们视为所有映射器!

在我的调试日志中,我看到mybatis正在接收我的界面:

12/9/13 11:18:44 904 [org.mybatis.spring.mapper.MapperScannerConfigurer$Scanner.findCandidateComponents:4125] - Scanning file [D:\Weblogic\wls11\domains\ldapdomain\autodeploy\default\WEB-INF\classes\com\blah\MyInterface.class]
12/9/13 11:18:44 904 [org.mybatis.spring.mapper.MapperScannerConfigurer$Scanner.findCandidateComponents:4125] - Identified candidate component class: file [D:\Weblogic\wls11\domains\ldapdomain\autodeploy\default\WEB-INF\classes\com\blah\MyInterface.class]
12/9/13 11:18:44 904 [org.mybatis.spring.mapper.MapperScannerConfigurer$Scanner.findCandidateComponents:4125] - Scanning file [D:\Weblogic\wls11\domains\ldapdomain\autodeploy\default\WEB-INF\classes\com\blah\MyImplementation .class]
12/9/13 11:18:44 904 [org.mybatis.spring.mapper.MapperScannerConfigurer$Scanner.findCandidateComponents:4125] - Ignored because not a concrete top-level class: file [D:\Weblogic\wls11\domains\ldapdomain\autodeploy\default\WEB-INF\classes\com\blah\MyImplementation .class]

此接口没有XML,没有映射器命名空间,它只是一个普通的常规接口,MyBatis不应该认为它是映射器服务

1 个答案:

答案 0 :(得分:0)

好吧看起来MyBAtis扫描仪确实占用了每个接口,它没有任何“智能”来识别映射器接口,就像我认为的那样 - 基于找到匹配的XML或命名空间。我必须在映射器配置中添加一个过滤器,然后引入一个新的注释来注释我的映射器接口。