MyBatis with Spring: не удалось найти карту результатов - PullRequest
0 голосов
/ 10 января 2019

Я не могу отобразить результат запроса в bean-компонент с MyBatis и Spring Boot с использованием XML-файла.

Если я пытаюсь отобразить результат с аннотацией @ResultType (ResultBean.class), все работает, но я не знаю, как отобразить внутренний класс, поэтому я пытаюсь отобразить результат с помощью преобразователя xml.

У меня есть этот интерфейс:

public interface MyMapper {
    @ResultMap("MyBean")
    @Select("SELECT myData as myData FROM myTable")
    public List<MyMapper> getMappedData();
}

И у меня есть этот файл MyMapper.xml в том же пакете (класс java находится в src / main / java / myPackage, а файл xml находится в /src/main/resources/myPackage).

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="myPackage.MyMapper">
    <resultMap id="MyBean" type="MyBean">
        <id property="myData " column="myData " />
    </resultMap>
</mapper>

Это мой класс SpringBootServletInitializer:

@SpringBootApplication
@EnableTransactionManagement
@MapperScan("myPackage")
@PropertySource(value = "classpath:application.properties")
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    @Value("${spring.datasource.jndi-name}")
    private String jndiName;

    @Bean
    public DataSource dataSource() {
        final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
        DataSource dataSource = dsLookup.getDataSource(jndiName);
        return dataSource;
    }

    @Bean
    public DataSource jndiObjectFactoryBean() {
        JndiObjectFactoryBean jofb = new JndiObjectFactoryBean();
        jofb.setJndiName(jndiName);
        return (DataSource) jofb.getObject();
    }

    @Bean
    public DataSourceTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public ManagedTransactionFactory transactionFactory() {
        return new ManagedTransactionFactory();
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage("beansPackage");
        return sessionFactory;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
      SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
      sqlSessionFactory.setDataSource(dataSource());
      return (SqlSessionFactory) sqlSessionFactory.getObject();
    }

}

Боб

@Alias("MyBean")
public class MyBeanimplements Serializable {
    private static final long serialVersionUID = 3143220123058683967L;
    private String myData;
}

Но похоже, что MyBatis не может найти xml mapper, поэтому он не может отобразить результат на правильном бине. Я получаю ошибку:

16: 02: 56,074 ОШИБКА [Org.springframework.boot.web.servlet.support.ErrorPageFilter] (задание по умолчанию-1) Пересылка на страницу ошибки из запроса [/ MyPage / getData] из-за исключения [Не удалось найти карту результатов myPackage.MyMapper.MyBean]: org.apache.ibatis.builder.IncompleteElementException: не удалось найти Карта результатов myPackage.MyMapper.MyBean

Мне не хватает какой-то конфигурации? Может быть, в файле application.property?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Нашел решение: я использовал для файлов сопоставления xml пунктирный путь (идентичный имени пакета java mapper), но путь должен быть обычным (с косой чертой, а не с точками).

0 голосов
/ 10 января 2019

Вы должны ввести type CanonicalName класса

ех. MyBean pkg: org.mypkg.MyBean:

 <resultMap id="MyBean" type="org.mypkg.MyBean">
    <id property="myData " column="myData " />
</resultMap>
...