我有一个简单的API,它使用FeignClient来调用其他API并获得访问令牌。但是今天我不明白为什么我的客户端是空的。
你能解释一下为什么在运行时,我的伪客户端是空的吗?
@SpringBootApplication
@EnableFeignClients
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
我的控制器
@RestController
@RequestMapping("/api")
public class AppController {
private final MyService myService = new MyService();
}
我的服务@Service
public class MyService {
@Autowired
private MyClient myClient;
public AccessToken applicationLogin(final LoginParameters loginParameters) {
return myClient.getAccessToken(loginParameters);
}
}
我的客户
@FeignClient(name = "myClient", url = "https://myurl.com")
public interface MyClient {
@PostMapping("/auth/login")
AccessToken getAccessToken(@RequestBody LoginParameters loginParameters);
}
误差Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException: null
您使用错误的变量来调用方法而不是r2aClient
,您应该使用myClient
public AccessToken applicationLogin(final LoginParameters loginParameters) {
return myClient.getAccessToken(loginParameters);
}
编辑基于新的变化
我猜@EnableFeignClient
是无法找到类MyClient,试试@EnableFeignClient(basePackages = "<your package for MyClient>)
我认为你必须在你的Controller
中注入Service
。您将服务创建为普通java类,因此不会注入MyClient
。
@RestController
@RequestMapping("/api")
public class AppController {
@Autowired
private final MyService myService;
}
不要使用
new MyService();
如果使用'new',它将不会被spring管理。你可以通过
查看@RestController
public class MyController {
private IMyService iMyService = new MyServiceImpl();
}
@Service
public class MyServiceImpl implements IMyService {
@Autowired
private MyMapper myMapper;
//....
}
myMapper将始终为空。因为你用new创造了它。顺便说一下,从Spring 4开始,不建议使用字段注入