一、feignclient注解
feignclient注解被@target(elementtype.type)修饰,表示feignclient注解的作用目标在接口上
1
2
3
4
5
|
@feignclient(name = "github-client" , url = "https://api.github.com" , configuration = githubexampleconfig. class ) public interface githubclient { @requestmapping(value = "/search/repositories" , method = requestmethod.get) string searchrepo(@requestparam( "q" ) string querystr); } |
声明接口之后,在代码中通过@resource注入之后即可使用。@feignclient标签的常用属性如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@feignclient(name = "github-client" , url = "https://api.github.com" , configuration = githubexampleconfig. class , fallback = githubclient.defaultfallback. class ) public interface githubclient { @requestmapping(value = "/search/repositories" , method = requestmethod.get) string searchrepo(@requestparam( "q" ) string querystr); /** * 容错处理类,当调用失败时,简单返回空字符串 */ @component public class defaultfallback implements githubclient { @override public string searchrepo(@requestparam( "q" ) string querystr) { return "" ; } } } |
在使用fallback属性时,需要使用@component注解,保证fallback类被spring容器扫描到,githubexampleconfig内容如下:
1
2
3
4
5
6
7
|
@configuration public class githubexampleconfig { @bean logger.level feignloggerlevel() { return logger.level.full; } } |
在使用feignclient时,spring会按name创建不同的applicationcontext,通过不同的context来隔离feignclient的配置信息,在使用配置类时,不能把配置类放到spring app component scan的路径下,否则,配置类会对所有feignclient生效.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@restcontroller @requestmapping( "/v1/card" ) public class indexapi { @postmapping( "balance" ) @responsebody public info index() { info.builder builder = new info.builder(); builder.withdetail( "x" , 2); builder.withdetail( "y" , 2); return builder.build(); } } |
feign client
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@feignclient( name = "card" , url = "http://localhost:7913" , fallback = cardfeignclientfallback. class , configuration = feignclientconfiguration. class ) @requestmapping(value = "/v1/card" ) public interface cardfeignclient { @requestmapping(value = "/balance" , method = requestmethod.post, produces = mediatype.application_json_value) info info(); } |
if @requestmapping is used on class, when invoke http /v1/card/balance, like this :
如果 @requestmapping注解被用在feignclient类上,当像如下代码请求/v1/card/balance时,注意有accept header:
1
2
3
4
|
content-type:application/json accept:application/json post http: //localhost:7913/v1/card/balance |
那么会返回 404。
如果不包含accept header时请求,则是ok:
1
2
|
content-type:application/json post http: //localhost:7913/v1/card/balance |
或者像下面不在feign client上使用@requestmapping注解,请求也是ok,无论是否包含accept:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@feignclient( name = "card" , url = "http://localhost:7913" , fallback = cardfeignclientfallback. class , configuration = feignclientconfiguration. class ) public interface cardfeignclient { @requestmapping(value = "/v1/card/balance" , method = requestmethod.post, produces = mediatype.application_json_value) info info(); } |
如对本文有疑问, 点击进行留言回复!!
【java基础】面试常见问题:类和对象,封装继承多态,final关键字,static关键字,类加载过程,双亲委派模型
荐 Java语言基础之JDK1.8新特性(Lambda表达式、函数式接口、Stream流、新的日期API)
网友评论