Spring Boot MyBatis @MapperScan больше не работает как WAR - PullRequest
0 голосов
/ 23 мая 2019

Описание проблемы

У меня есть приложение Spring Boot Java, которое использует MyBatis Mappers, которое общается с DB2 через 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.Мне нужно изменить некоторые настройки, но я не могу понять, что.

=================== *===== *

Текущая конфигурация (Работает при работе на Eclipse IDE как приложение Spring Boot) ..

(1) Все преобразователи MyBatis java в com.myapplicaton.dao имеют @Mapper аннотация:

package com.myapplicaton.dao;

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

(2) Добавлена ​​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);
    }

}

(3) Использовать MyBatis Mappers в @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;

    //...
}
package com.myapplicaton.beans;

public class ThingTypes {
    @Autowired
    MybatisMapper mybatisMapper;

    //...
}

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

Вопрос

Почему это не работает при развертывании как WAR?

1 Ответ

0 голосов
/ 24 мая 2019

Хорошо, после того, как я возился с этим весь день, у меня вроде есть ответ.

Во-первых, , мне пришлось удалить два «проблемных» бина, которые я использовал на @PostConstruct.метод init(), в котором использовался картограф @Autowired 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 и только *В этой папке находилось 1028 * class файлов.Я не мог понять, как разархивировать .xml файлы с помощью spring-boot-maven-plugin, и я не собирался пытаться найти другой плагин, поэтому я смог побить систему следующим образом:

Iсоздал набор папок в папке src/main/resources/ приложения с точно такой же структурой папок, в которой находились .java interface mappers.Итак, я создал src/main/resources/com/myapplication/dao.Я положил туда все файлы .xml.

После проверки новой WAR файлы .xml были помещены в тот же каталог, что и файлы java class, и MyBatis работал правильно.

Ура.

...