Feign+mybatisplus搭建項(xiàng)目遇到的坑及解決
出現(xiàn)的錯(cuò)誤
1.Failed to bind properties under ‘spring.datasource’ to javax.sql.DataSource:
2.@org.springframework.beans.factory.annotation.Autowired(required=true)等
原因(簡(jiǎn)潔說(shuō)明)
使用代碼生成器的service層需要繼承extends IService,這是一個(gè)坑,它不可以在接口工程中使用,實(shí)體類(lèi)可以
如果想要使用mp的功能,就需要:
—— > 1.接口工程中創(chuàng)建無(wú)extends IService的接口 A
—— > 2.provider工程中放入代碼生成的service層 接口B
—— > 3.provider工程的實(shí)現(xiàn)類(lèi)需要 implements A,B
代碼
接口工程
import com.study.seckill.entity.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.util.List; @Service @FeignClient(value = "seckill-provider-localhost") public interface IUserService /*extends IService<User>*/ { @RequestMapping(value = "/users",method = RequestMethod.GET) public List<User> quallAll(); }
接口工程依賴(lài)
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generate</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
–注意不要有druid數(shù)據(jù)源依賴(lài),可能會(huì)報(bào)sqlSession等異常–
consumer工程代碼
controller
@RestController public class UserConsumerController { @Autowired private IUserService iUserService; @GetMapping(value = "/users") public String queryByName(){ List<User> users = iUserService.quallAll(); return users.toString(); } }
啟動(dòng)類(lèi)
@EnableFeignClients(basePackages = {"com.study.seckill"}) @SpringBootApplication @EnableEurekaClient public class Seckill_Consumer_8080 { public static void main(String[] args) { SpringApplication.run(Seckill_Consumer_8080.class, args); } }
consumer依賴(lài)
<dependencies> <dependency> <groupId>com.study</groupId> <artifactId>seckill-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.4.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> </dependencies>
consumer的application.yml
server: port: 8080 #配置eureka eureka: client: register-with-eureka: true service-url: defaultZone: http://localhost:7001/eureka/ instance: instance-id: seckill-consumer-8080 prefer-ip-address: true spring: application: name: seckill-consumer-8080 #開(kāi)啟降級(jí) feign: # hystrix: # enabled: true #feign客戶(hù)端負(fù)載均衡策略 #seckill-provider-localhost: # ribbon: # ## NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置規(guī)則 隨機(jī) # NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置規(guī)則 輪詢(xún) ## NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置規(guī)則 重試 ## NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置規(guī)則 響應(yīng)時(shí)間權(quán)重 ## NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置規(guī)則 最空閑連接策略 # ConnectTimeout: 5000 #請(qǐng)求連接超時(shí)時(shí)間 # ReadTimeout: 10000 #請(qǐng)求處理的超時(shí)時(shí)間 # OkToRetryOnAllOperations: true #對(duì)所有請(qǐng)求都進(jìn)行重試 # MaxAutoRetriesNextServer: 2 #切換實(shí)例的重試次數(shù) # MaxAutoRetries: 2 #對(duì)當(dāng)前實(shí)例的重試次數(shù)
prodvider工程
如圖:UserServiceImpl 需要實(shí)現(xiàn)這個(gè)UserService和IUserService
import com.baomidou.mybatisplus.extension.service.IService; import com.study.seckill.entity.User; public interface UserService extends IService<User> { }
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.study.seckill.entity.User; import com.study.seckill.mapper.UserMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.study.seckill.service.IUserService; import com.study.seckill.service.UserService; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService, UserService { @Override public List<User> quallAll() { QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); return baseMapper.selectList(null); } }
provider的application.properties
mybatis-plus.type-aliases-package=com.study.seckill.entity mybatis-plus.global.config.refresh-mapper=true mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml
provider依賴(lài)
<dependencies> <dependency> <groupId>com.study</groupId> <artifactId>seckill-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <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.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.1.1</version> </dependency> <!--用來(lái)支持AR--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generate</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.1.1</version> </dependency> <!--自動(dòng)生成模板--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.29</version> </dependency> <!--連接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </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> </dependencies> <build> <!-- 添加資源 --> <resources> <resource> <directory>src/main/resources</directory> <!-- src/main/resources下的指定資源放行 --> <includes> <include>**/*.properties</include> <include>**/*.yml</include> <include>**/**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
provider工程需要配置druid數(shù)據(jù)源,不然會(huì)報(bào)異常,這里不再贅述。
總結(jié)
在搭建工程上踩了兩天坑。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
maven profile自動(dòng)切換環(huán)境參數(shù)的2種方法詳解
這篇文章主要給大家介紹了關(guān)于maven profile自動(dòng)切換環(huán)境參數(shù)的2種方法,文中通過(guò)示例代碼將這兩種方法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04springboot+springsecurity+mybatis+JWT+Redis?實(shí)現(xiàn)前后端離實(shí)戰(zhàn)教程
這篇文章主要介紹了springboot+springsecurity+mybatis+JWT+Redis?實(shí)現(xiàn)前后端離實(shí)戰(zhàn)教程,需要的朋友可以參考下2024-01-01java 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的相關(guān)資料,這里對(duì)java中的棧和隊(duì)列都做出實(shí)現(xiàn)實(shí)例來(lái)幫助大家理解學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2017-07-07mybatis-plus中wrapper的用法實(shí)例詳解
本文給大家介紹了mybatis-plus中wrapper的用法,包括條件構(gòu)造器關(guān)系、項(xiàng)目實(shí)例及具體使用操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02Spring Boot JPA訪(fǎng)問(wèn)Mysql示例
本篇文章主要介紹了Spring Boot JPA訪(fǎng)問(wèn)Mysql示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Mybatis事務(wù)如何跟Spring結(jié)合(數(shù)據(jù)庫(kù)事務(wù)特性和Spring事務(wù)管理源碼)
MyBatis與Spring的事務(wù)結(jié)合主要是通過(guò)Spring的事務(wù)管理和MyBatis的數(shù)據(jù)庫(kù)操作來(lái)實(shí)現(xiàn)的,在本文中,我們將從數(shù)據(jù)庫(kù)事務(wù)特性和Spring事務(wù)管理源碼兩個(gè)角度來(lái)分析MyBatis事務(wù)如何與Spring結(jié)合到一起的原理,感興趣的朋友一起看看吧2024-01-01MybatisPlus 插入或更新數(shù)據(jù)時(shí)自動(dòng)填充更新數(shù)據(jù)解決方案
本文主要介紹了MybatisPlus 插入或更新數(shù)據(jù)時(shí)自動(dòng)填充更新數(shù)據(jù)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Swagger2配置Security授權(quán)認(rèn)證全過(guò)程
這篇文章主要介紹了Swagger2配置Security授權(quán)認(rèn)證全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Spring Boot Gradle發(fā)布war到tomcat的方法示例
本篇文章主要介紹了Spring Boot Gradle發(fā)布war到tomcat的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03