我有一个简单的界面:
public interface ServiceClient {
String REFRESH_ENDPOINT = "/admin/refresh";
ResponseEntity<String> refresh();
}
和少数FeignClient这样的客户:
@FeignClient(name = "${ServiceA.name}", configuration =
FeignConfiguration.class, decode404 = true)
public interface ServiceA extends ServiceClient {
@PostMapping(path = REFRESH_ENDPOINT)
ResponseEntity<String> refresh();
}
然后我这样做:
private final List<ServiceClient> services;
...
services.parallelStream()
.collect(Collectors.toMap(s-> s.getClass().getName(), s-> s.refresh().getStatusCode()));
我如何获得Feign客户的名字? getClass().getName()
给了我Proxy154
。我希望不要在我拥有的每个FeignClient中创建静态字段。
答案 0 :(得分:1)
您可以使用AopProxyUtils。
services.parallelStream()
.collect(Collectors.toMap(s->
AopProxyUtils.proxiedUserInterfaces(greetingClient)[0].getName(),
s-> s.refresh().getStatusCode()));
不确定是否要使用类名或@FeignClient
批注中的名称。如果要在注释中使用该名称,则可以像这样
Class<?>[] classes = AopProxyUtils.proxiedUserInterfaces(greetingClient);
FeignClient annotation = classes[0].getAnnotation(FeignClient.class);
System.out.println(annotation.name());
答案 1 :(得分:0)
您将获得的是Spring创建的代理类名称。要获取代理类名称的原始类名称,请使用spring提供的实用程序类
您可以使用此类public static java.lang.Class<?> getUserClass(java.lang.Class<?> clazz)
的方法,其描述为:
返回给定类的用户定义类:通常只是给定类,但如果是CGLIB生成的子类,则返回原始类。