« Interface de type ne sait pas à l'MapperRegistry » exception en utilisant mybatis
Question
Je mybatis la mise en place des annotations à l'aide, et d'obtenir cette exception utile
org.apache.ibatis.binding.BindingException: Type d'interface org.foo.Bar est pas connu du MapperRegistry
googler ne trouve rien, ni le guide de l'utilisateur. Qu'est-ce que je manque?
La solution 3
OK, il a obtenu - ce qui se passe parce que je travaillais avec un fichier XML pour la configuration, et les annotations pour les cartographes eux-mêmes -. Et mybatis ne trouve pas Mapper annotations lors de l'utilisation d'une configuration XML
Voir cette question suivi.
Autres conseils
juste pour tous ceux qui ont fini par ici parce qu'ils sont nouveaux pour mybatis
http://www.mybatis.org/core/configuration.html
http://www.mybatis.org/mybatis-3/configuration.html
dans la section cartographes de fichier de configuration
<mappers>
<mapper class="my.package.com.MyClass"/>
</mappers>
vous ont opérationnel avec une config.xml et des interfaces annotés
add Mapper classe à votre configuration SqlSessionFactory comme ceci:
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(reader);
//very import
factory.getConfiguration().addMapper(BarMapper.class);
SqlSession sqlSession = factory.openSession();
Dans l'espace de nom de votre fichier mapper.xml mappeur doit être le chemin à l'interface mappeur.
par exemple:
<mapper namespace="com.mapper.LineMapper">
<select id="selectLine" resultType="com.jiaotong114.jiaotong.beans.Line">
select * from bus_line where id = #{id}
</select>
</mapper>
votre interface mappeur devrait être dans le paquet de com.mapper et le nom de celui-ci est LineMapper.
Il se peut que votre fichier mapper.xml utilise l'espace de nom incorrect (peut-être à cause d'une erreur de copier coller).
Par exemple, supposons que vous avez une interface Java appelée MyEntityMapper.java
que devrait être lié à un appelé MyEntityMapper.xml
config mybatis mappeur 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>
Notez que l'attribut namespace
sur l'élément <mapper>
dans MyEntityMapper.xml
pointent vers un mappeur inexistante non.existent.package.NonExistentMapper
, quand vraiment devrait pointer vers my.mappers.MyEntityMapper
.
L'interface de type org.domain.classmapper est inconnu du MapperRegistry
mybatis jette cette exception si le package complet / classe n'est pas entré dans l'espace de noms XML Mapper.
par exemple.
<mapper namespace="classmapper">
fait exception, mais
<mapper namespace="org.domain.classmapper">
fonctionne
il me est arrivé lors de la création d'un shadowJar / bootJar pour un projet de démarrage de printemps et en utilisant org.springframework.boot plug-in gradle
Lorsque les bocaux sont compressés dans la mybatis bootJar peut manquer de trouver les fichiers de configuration XML et jetteront l'exception décrite
ajouter ce bloc dans le fichier build.gradle:
bootJar {
requiresUnpack '**/MyProblematic.jar'
}
résolu mon problème