Spring boot Spring Boot MyBatis@Mappers不再具有战争功能
问题描述 我有一个Spring boot Spring Boot MyBatis@Mappers不再具有战争功能,spring-boot,war,mybatis,Spring Boot,War,Mybatis,问题描述 我有一个springbootJava应用程序,它使用MyBatisMappers,通过使用接口和XML与进行通信 当作为eclipseide中的Spring Boot应用程序运行时,此设置可以正常工作。但是,当我使用Mavan将应用程序构建为WAR文件,并将其部署到外部Tomcat服务器上时,突然收到错误,应用程序部署时找不到我的映射程序: org.springframework.beans.factory.UnsatisfiedDependencyException: Error c
springboot
Java
应用程序,它使用MyBatis
Mappers
,通过使用接口和XML
与进行通信
当作为eclipseide
中的Spring Boot
应用程序运行时,此设置可以正常工作。但是,当我使用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
运行时,应用程序不再以mappers
的身份扫描这些MyBatis
mappers
。我必须改变一些配置,但我不知道是什么
====================
当前配置(在EclipseIDE
上作为SpringBoot
应用程序运行时工作)
(1) com.myapplicaton.dao中的所有MyBatis
java
Mapper都有@Mapper
注释:
package com.myapplicaton.dao;
@Mapper
public interface MybatisMapper {
List<Thing> selectByExample(ThingExample example);
//...
}
(3) 在@Autowired
类中使用MyBatis
映射器:
@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();
}
}
====================
问题
为什么当部署为战争时,这不起作用呢?好吧,在处理了一整天之后,我有了一个答案
首先,我必须删除两个“问题”bean,它们使用了@PostConstruct
,使用了@Autowired
映射器的init()
方法。我不知道为什么它不喜欢这样,但我不在乎,因为在我删除它们之后,应用程序作为WAR
正常启动。。大部分
它曾经做过这样的事情:
package com.myapplicaton.beans;
public class ThingTypes {
@Autowired
MybatisMapper mybatisMapper;
@PostConstruct
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
private void init() {
mybatisMapper.selectByExample(example);
}
}
我遇到的第二个问题是,应用程序在部署为WAR
时,在我的dao
包中找不到MyBatis
mapper
.xml
文件。和往常一样,在Eclipse上运行时一切正常
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.myapplicaton.dao.MybatisMapper.selectByExample
我检查了WAR
文件,发现.xml
文件被Maven
跳过了,只有Java
类
文件存在于该文件夹中。我不知道如何使用spring boot maven plugin
取消禁用.xml
文件,我也不打算尝试另一个插件,因此我能够击败系统,如下所示:
我在应用程序的src/main/resources/
文件夹中创建了一组文件夹,其文件夹结构与.java
接口的位置完全相同。因此,我创建了src/main/resources/com/myapplication/dao
。我把所有的.xml
文件都放在那里
在检查新WAR时,.xml
文件与java
类
文件放在同一目录中,MyBatis
工作正常
万岁。你试过这个吗?让我知道是否有效@MissKitty@Aliy你好我之前看过这篇文章。但是,我根本没有实现EnvironmentAware的MybatisConfiguration。当我尝试它时,EnvironmentAware强制您实现一个名为setEnvironment(环境)的方法,而我完全不知道该环境是/应该是什么。当我尝试使用环境方法不做任何事情时,它似乎不会以任何方式改变任何东西。做得好这可能也会帮助其他人:)谢谢分享
package com.myapplicaton.beans;
public class ThingTypes {
@Autowired
MybatisMapper mybatisMapper;
//...
}
package com.myapplicaton.beans;
public class ThingTypes {
@Autowired
MybatisMapper mybatisMapper;
@PostConstruct
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
private void init() {
mybatisMapper.selectByExample(example);
}
}
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.myapplicaton.dao.MybatisMapper.selectByExample