Spring Boot MyBatis @MapperScan不再充当WAR

时间:2019-05-23 16:23:16

标签: spring-boot war mybatis

问题描述

我有一个Spring Boot Java应用程序,它使用MyBatis Mappers,该应用程序通过将DB2与{{1 }}。

interfaces中作为XML应用程序运行时,此设置可以正常工作。但是,当我使用Spring Boot将应用程序构建为Eclipse IDE文件并将其部署在外部Mavan服务器上时,突然收到错误消息,指出在部署应用程序时找不到映射器:

WAR

我感到,当以Tomcat运行时,应用程序不再将org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springmapper': Unsatisfied dependency expressed through field 'thingTypes'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'otherthingtypes': Invocation of init method failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.myapplicaton.dao.MybatisMapper.selectByExample WAR扫描为MyBatis。我必须更改一些配置,但是我不知道要做什么。

===================

当前配置(在mappers上以mappers应用程序运行时有效)。

(1)com.myapplicaton.dao中的所有Eclipse IDE Spring Boot映射器都带有MyBatis批注:

java

(2)在应用程序启动中添加了@Mapper

package com.myapplicaton.dao;

@Mapper
public interface MybatisMapper {
   List<Thing> selectByExample(ThingExample example);
   //... 
}

(3)在MapperScan类中使用@SpringBootApplication @MapperScan({"com.myapplicaton.dao","com.myapplicaton.other.mappers"}) public class MyApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } 映射器:

MyBatis
@Autowired
@Configuration
public class SomeConfig {

    @Bean(name = "springmapper")
    @Scope(value = "singleton")
    public SpringMapper getSpringMapper() {
        return new SpringMapper();
    }

    @Bean(name = "thingTypes")
    @Scope(value = "singleton")
    public ThingTypes thingTypes() {
        return new ThingTypes();
    }
}

===================

问题

为什么将其部署为package com.myapplicaton.other.mappers; public class SpringMapper { @Autowired ThingTypes thingTypes; //... } 时不起作用?

1 个答案:

答案 0 :(得分:0)

好了,整天忙碌了之后,我有一个答案。

首先,我必须删除在使用@PostConstruct {{1}的init()方法上使用@Autowired的两个“问题” bean }映射器。我不知道为什么它不喜欢这样,但是我不在乎,因为在删除它们之后,该应用程序通常以Mybatis的身份正常启动。

它曾经做过这样的事情:

WAR

第二个问题,我遇到的问题是,当应用程序部署为package com.myapplicaton.beans; public class ThingTypes { @Autowired MybatisMapper mybatisMapper; @PostConstruct @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) private void init() { mybatisMapper.selectByExample(example); } } 时,应用程序无法在我的MyBatis包中找到mapper .xml dao个文件WAR。像往常一样在Eclipse上运行时很好。

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.myapplicaton.dao.MybatisMapper.selectByExample

我检查了WAR文件,瞧瞧,.xml已跳过Maven文件,只有Java class个文件存在该文件夹。我无法弄清楚如何使用.xml来跳过spring-boot-maven-plugin个文件,而且我也不想尝试找出另一个插件,因此可以按以下方式击败系统:

我在应用程序的src/main/resources/文件夹中创建了一组文件夹,其文件夹结构与.java interface mappers所在的文件夹结构完全相同。因此,我创建了src/main/resources/com/myapplication/dao。我将所有.xml文件放在其中。

检查新的WAR后,将.xml文件与java class文件放置在同一目录中,并且MyBatis正常工作。

Hurrah。