web-dev-qa-db-ja.com

mybatisを使用した「タイプインターフェイスはMapperRegistryに認識されていません」例外

アノテーションを使用してmybatisを設定していますが、この便利な例外が発生しています

org.Apache.ibatis.binding.BindingException:タイプインターフェイスorg.foo.BarはMapperRegistryに認識されていません

グーグルで 何も見つかりません。ユーザーガイドも見つかりません。何が足りないのですか?

16
ripper234

OK、わかりました-これは、構成にXMLファイルを使用し、マッパー自体の注釈を使用していたために発生しています-XML構成を使用すると、mybatisはマッパーの注釈を検出しません。

これを参照してください フォローアップの質問

7
ripper234

mybatisを初めて使用するためにここにたどり着いた人のためだけに http://www.mybatis.org/core/configuration.html
http://www.mybatis.org/mybatis-3/configuration.html

設定ファイルマッパーセクション

<mappers>
<mapper class="my.package.com.MyClass"/>
</mappers>

これにより、config.xmlと注釈付きインターフェースを使用して実行できるようになります

22
dolbysurnd

Mapperクラスを次のようにSqlSessionFactory構成に追加します。

SqlSessionFactory factory = new SqlSessionFactoryBuilder()
            .build(reader);

//very import
factory.getConfiguration().addMapper(BarMapper.class);

SqlSession sqlSession = factory.openSession();
8
Green Lei

Mapper.xmlファイルでは、マッパーの名前空間がマッパーインターフェイスへのパスである必要があります。

例えば:

<mapper namespace="com.mapper.LineMapper">
<select id="selectLine" resultType="com.jiaotong114.jiaotong.beans.Line">
select * from bus_line where id = #{id}
</select>
</mapper>

マッパーインターフェイスはcom.mapperパッケージに含まれている必要があり、その名前はLineMapperです。

2
inter18099

タイプインターフェイスorg.domain.classmapperはMapperRegistryに認識されていません

完全なパッケージ/クラスがマッパーxml名前空間に入力されていない場合、MyBatisはこの例外をスローします。

例えば<mapper namespace="classmapper">は例外を引き起こしますが、

<mapper namespace="org.domain.classmapper">動作します

1
Daniel de Zwaan

Mapper.xmlファイルが誤った名前空間を使用している可能性があります(おそらくコピーアンドペーストエラーが原因です)。

たとえば、shouldがmybatisにリンクされているMyEntityMapper.Javaと呼ばれるJavaインターフェイスがあるとします。 MyEntityMapper.xmlと呼ばれるマッパーxml構成:

MyEntityMapper.Java

package my.mappers;

public interface MyEntityMapper {
    MyEntity getById(@Param("id") String id);
}

MyEntityMapper.xml

<?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="non.existent.package.NonExistentMapper">

    <resultMap id="MyEntityResultmap" type="MyEntity">
        <!-- some result map stuff here -->
    </resultMap>

    <select id="getByUuid" resultMap="MyEntityResultMap">
        <!-- some sql code here -->
    </select>
</mapper>

<mapper>MyEntityMapper.xml要素のnamespace属性は、実際にはnon.existent.package.NonExistentMapperを指しているはずなのに、存在しないマッパーmy.mappers.MyEntityMapperを指していることに注意してください。 。

1
bobbyberg

SpringBootプロジェクト用のshadowJar/bootJarを作成し、org.springframework.bootgradleプラグインを使用しているときに私に起こりました

JarファイルがbootJar内で圧縮されると、myBatisはXML構成ファイルを見つけられず、説明されている例外をスローする可能性があります。

このブロックをbuild.gradleファイルに追加します。

bootJar {
    requiresUnpack '**/MyProblematic.jar'
}

私の問題を解決しました

0
Maayan Hope