位于 JAR 中的自动装配 Feign 接口

Posted

技术标签:

【中文标题】位于 JAR 中的自动装配 Feign 接口【英文标题】:Autowiring Feign interface located in JAR 【发布时间】:2018-03-12 09:38:42 【问题描述】:

我有一个 AttachmentApi 服务类,它使用一个 feign interface 两者都位于一个 JAR 文件中,我在 client microservice 中用作依赖项。 该客户端微服务的controller 使用AttachmentApi 服务从数据库获取数据。 当我访问该控制器的某个端点时,AttachmentApi 服务是 成功自动装配,但假装界面没有,它给了我以下异常:

java.lang.NullPointerException: null
at ma.co.omnidata.framework.services.attachment.api.AttachmentApi.upload(AttachmentApi.java:26) ~[classes/:na]
at ma.co.omnidata.attachment.user.service.impl.AttachmentsUserService.uploadFile(AttachmentsUserService.java:21) ~[classes/:na]
at ma.co.omnidata.attachment.user.controllers.AttachmentUserController.uploadFile(AttachmentUserController.java:31) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_144]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_144]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_144]

null 是由于 feign 接口没有自动装配! 知道我在springboot类中使用了以下注解

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages= "my.packages.including.the.feign.interface.package")

任何建议将不胜感激 谢谢!

更新 1

Feign接口(位于JAR依赖中)

@FeignClient(name="attachment-service", fallback=AttachmentHystrixFallback.class)
public interface AttachmentFeignClient 

@RequestMapping("attachment/id")
byte[] getAttachment(@PathVariable(name="id") String id);

@RequestMapping("attachments")
List<AttachmentDto> getAttachments(@RequestParam(name="attachableId") Long attachableId, 
        @RequestParam(name="className") String className, @RequestParam(name="appName") String appName);

@RequestMapping("upload")
void upload(MultipartFile file, @RequestParam(name="attachableId") Long attachableId, 
        @RequestParam(name="className") String className, @RequestParam(name="appName") String appName);

@RequestMapping("test")
String test();

AttachmentApi(也位于 JAR 依赖项中)

@Service
public class AttachmentApi implements IAttachmentApi 

@Autowired
AttachmentFeignClient client;

@Override
public byte[] getAttachment(String id) 
    return client.getAttachment(id);


@Override
public void upload(IAttachable entity, MultipartFile file) 
    client.upload(file, entity.getAttachableId(), entity.getClassName(), entity.getAppName());


@Override
public List<AttachmentDto> getAttachments(IAttachable entity) 
    return client.getAttachments(entity.getAttachableId(), entity.getClassName(), entity.getAppName());



public String test() 
    return client.test();

注意:我的客户端微服务无法自动装配位于 JAR 依赖项中的任何 bean(既不是 Feign 接口也不是 AttachmentApi 类)!

【问题讨论】:

【参考方案1】:

试试这个

@EnableFeignClients(clients = AttachmentFeignClient.class)

【讨论】:

以上是关于位于 JAR 中的自动装配 Feign 接口的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 - 自动装配服务时对 Feign 客户端的不满意依赖

依赖 jar 的类中的自动装配注释

从源码中理解Spring Boot自动装配原理

使用 @DataJpaTest 的 Spring 测试无法使用 @Repository 自动装配类(但使用接口存储库可以工作!)

SpringBoot自动装配原理及自定义start开发

SpringBoot自动装配原理及自定义start开发