“Tipo de interface não é conhecido pela exceção da maperegistry” usando o mybatis

StackOverflow https://stackoverflow.com/questions/4263832

  •  27-09-2019
  •  | 
  •  

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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top