java - springboot+mybatis 多模块项目maven
问题描述
下图是我的项目结构。 项目结构
父项目是demo-mybatis 子模块是mybatis-dao,demo-service。demo-mybatis pom.xml 如下:
4.0.0 pom mybatis-dao demo-service demo-mybatis-app org.springframework.boot spring-boot-starter-parent 2.3.2.RELEASE com.example demo-mybatis 0.0.1-SNAPSHOT demo-mybatis 春季演示项目引导
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
mybatis-dao UserMapper.java 接口:```
@Repository
public interface UserMapper {
List selectByName(String name);
int insert(User user);
void update(User user);
void delete(Long id);
User verify(User user);
List select();
}
demo-service UserServiceImpl.java class :
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public List selectByName(String name) {
return null;
}
@Override
public int insert(User user) {
return 0;
}
}
run application class :
``` @SpringBootApplication
@ComponentScan(basePackages = {"com.example","com.wjs"})
@EnableCaching(proxyTargetClass = true)
@MapperScan(basePackages = {"com.wjs.model.dao"})
public class DemoMybatisAppApplication {
public static void main(String[] args) {
SpringApplication.run(DemoMybatisAppApplication.class, args);
}
}
application.properties :</p>
server.port=8002
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.application.name=demo-mybatis
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.wjs.model.entity
下面总是异常:我找不到为什么?我试试这个:
@Resource
private UserMapper userMapper;
问题是:
nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'userMapper' is expected to be of type 'com.wjs.model.dao.UserMapper' but was actually of type 'com.sun.proxy.$Proxy55'
和
@Autowired
private UserMapper userMapper;
问题是:
No qualifying bean of type 'com.wjs.model.dao.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
我疯了
解决方案
@Mapper 公共接口 UserMapper
描述:
bean 'userMapper' 不能作为 'com.example.mapper.UserMapper' 注入,因为它是一个 JDK 动态代理,它实现:
行动:
考虑将 bean 作为其接口之一注入或通过在 @EnableAsync 和/或 @EnableCaching 上设置 proxyTargetClass=true 来强制使用基于 CGLib 的代理。
推荐阅读
- swift - ARC 如何作用于强制展开的实例
- php - 数组与同一年合并
- firebase - 身份验证用户的firebase实时数据库规则
- node.js - 为什么 NodeJS 说数组是对象?
- javascript - jQuery/Javascript 计算月、周、日、小时、分钟和秒的两个日期之间的差异
- mysql - 使用每列的 isVisible 值实现数据库结构
- javascript - 内容固定时通过触摸或滚动导航
- reactjs - 在渲染到屏幕之前对内存中的视频加载做出反应
- ruby-on-rails - 无法在 Heroku 上的 R 中写入绘图的 png
- php - Laravel 从分页中获取所有项目的数据