如何手动创建FeignClient.starter(主要能自定义Url,当做HttpClient调用)
***Tips都在代码注释中***
在最近需求中,需要写一个starter,并且用feignclient调用其他程序,但是一开始脑子秀逗了,正常FeignClient不是注解表明Url吗,但是starter中properties不是对象吗,怎么搞,后来想到,别人再用的时候,你直接${}使用者properties中的定义不就行了吗。网上的博文全是抄来抄去的,并且坑很多没填,所以我摸索的正确结果,写出来。废话不多说,开搞。顺带写一波怎么自定义starter,
首先是依赖,包括starter的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-gson</artifactId>
<version>8.12.0</version>
<exclusions>
<exclusion>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
</exclusion>
</exclusions>
</dependency>
在resources目录下创建 META-INF 文件夹,创建 spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xc.sso.SSOConfiguration
创建扫描文件
/**
* @author xvjinjiang
* @version $Id: SSOConfiguration.java, 2020/11/10--15:24 Exp $$
*/
@Configuration
//@EnableFeignClients 这里如果用注解创建FeignClient,就需要Enable
@ComponentScan("com.xc.sso.client")//扫描路径
@EnableConfigurationProperties(SsoProperties.class)// 主要是注入properties
public class SSOConfiguration {
}
创建properties
/**
* @author xvjinjiang
* @version $Id: SsoProperties.java, 2020/11/10--15:18 Exp $$
*/
@Component
@ConfigurationProperties(prefix = "sso.config")//表明是properties配置类
//profix,properties里的前缀,使用者properties中 sso.config.doMain 来定义,启动后自动注入你这个对象
public class SsoProperties {
/**
* 访问域名配置
*/
private String doMain;
/**
* 应用ID
*/
private String app_id;
}
创建接口,FeignClient只支持接口创建
//@FeignClient(value = "xxxxxx",url = "xxx.xxx")
//需要注解方式创建的时候开启,url一定要有http或s前缀
public interface SsoClient {
@PostMapping(value = "xxxx/xxx", consumes = MediaType.APPLICATION_JSON_VALUE)
Response postDemo(@RequestBody Request);
//consumes,请求体为Json格式,
//小Tips;Res和Req可以 post请求可以不同对象和形参名,但是对象里的属性必须相同,可以适当减少,但是一定要相同
}
FeignClient手动创建配置Config
/**
* @author xvjinjiang
* @version $Id: SsoClientDemo.java, 2020/11/10--17:09 Exp $$
*/
@Configuration//标识配置类
@Import(FeignClientsConfiguration.class)//导入FeignClientConfig
@EnableConfigurationProperties(SsoProperties.class)//为了导入properties,并使用
public class SsoClientConfig {
@Autowired
private SsoProperties ssoProperties;
@Bean
public feign.Logger.Level multipartLoggerLevel() {
return Logger.Level.BASIC;
}
@Bean
public SsoClient SsoClient(Contract contract) {
//这里contract会自动注入默认的,但是!!!!!encoder,和decoder参数选择就用Gsoncoder
//FeignClientsConfiguration内部有很多种coder,默认的话,不支持Json请求,或者会导致对象模糊,无法配置,这里是重点,网上的乱七八糟的,
return Feign.builder()
.contract(contract)
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
//这里就能拿到配置类中配置的Url并且导入,重点!!一定要有http://前缀,不然会报错
.target(SsoClient.class, ssoProperties.getDoMain());
}
}
最后达成Jar包,引入后,在properties里配置即可使用,一定要配http或者https前缀
然后就可以@Autowired注入使用FeignClient接口了
sso.config.app-id=XXXX
sso.config.do-main=http://localhost:8080