“Tipo de interface não é conhecido pela exceção da maperegistry” usando o mybatis
Pergunta
Estou configurando mybatis usando anotações e obtendo esta exceção útil
org.apache.ibatis.binding.bindingException: type interface org.foo.bar não é conhecido pelo MapperRegistry
Pesquisando no Google Não encontra nada, nem o guia do usuário. o que estou perdendo?
Solução 3
OK, entendeu - isso está acontecendo porque eu estava usando um arquivo XML para a configuração e anotações para os próprios mapeadores - e o mybatis não encontra anotações de mapas ao usar uma configuração XML.
Veja isso questão a seguir.
Outras dicas
Só para quem acabou aqui porque é novo em mybatishttp://www.mybatis.org/core/configuration.html
http://www.mybatis.org/mybatis-3/configuration.html
Na seção Mappers de arquivo de configuração
<mappers>
<mapper class="my.package.com.MyClass"/>
</mappers>
Isso fará com que você esteja funcionando com um config.xml e interfaces anotadas
adicionar Mapeador Classe para sua configuração SQLSessionFactory como esta:
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(reader);
//very import
factory.getConfiguration().addMapper(BarMapper.class);
SqlSession sqlSession = factory.openSession();
No seu espaço de nome do mapero.xml, o espaço de nome do mapeador deve ser o caminho para a interface do mapeador.
por exemplo:
<mapper namespace="com.mapper.LineMapper">
<select id="selectLine" resultType="com.jiaotong114.jiaotong.beans.Line">
select * from bus_line where id = #{id}
</select>
</mapper>
Sua interface de mapeador deve estar no pacote com.mapper e o nome é o LineMapper.
Pode ser que o seu arquivo Mapper.xml esteja usando o espaço para nome incorreto (talvez por causa de um erro de pasta de cópia).
Por exemplo, digamos que você tenha uma interface Java chamada MyEntityMapper.java
este deve estar ligado a uma configuração Mybatis Mapper XML chamada MyEntityMapper.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>
Observe que o namespace
atributo no <mapper>
elemento em MyEntityMapper.xml
está apontando para algum mapeador inexistente non.existent.package.NonExistentMapper
, quando realmente deveria estar apontando my.mappers.MyEntityMapper
.
Tipo de interface org.domain.classmapper não é conhecido pelo maperegistry
O Mybatis lança essa exceção se o pacote / classe completo não for inserido no espaço para nome do Mapper XML.
por exemplo<mapper namespace="classmapper">
causa exceção, mas
<mapper namespace="org.domain.classmapper">
funciona
Aconteceu comigo ao criar um Shadowjar/Bootjar para um projeto de inicialização da primavera e usar o plugin org.springframework.boot gradle
Quando os frascos são fechados dentro do bootjar mybatis podem deixar de encontrar os arquivos de configuração XML e lançará a exceção descrita
Adicionando este bloco no arquivo Build.gradle:
bootJar {
requiresUnpack '**/MyProblematic.jar'
}
resolveu meu problema