今天学习springcloud feign是所遇到的坑。(以下都是我自己在学习是遇到的问题和自己的看法,有正确的地方希望大家指出,我好及时的学习改正)
首先我的3个项目
1 micro-provider 接口提供者
2 micro-consumer 接口消费者
3 micro-eureka-server eureka服务
前提是我已经将1,2作为eureka client注册到了3中。
User类
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
micro-provider中controller提供rest接口如下所(不涉及数据库)
@RestController
@RequestMapping("/api/")
public class APIController {
@GetMapping("getuser/{id}")
public User getUser(@PathVariable("id") int id){
User user = new User();
user.setId(id);
user.setName("mt"+id);
return user;
}
@PostMapping("register")
public User registerUser(@RequestBody User user){
return user;
}
}
这里的坑GET方法写成这种虽然可以,但是在之后消费者使用Feign调用提供者的时候会报错,所以只能写成上面的那种形式
其次,采用上面的那种写法时@PathVariable(“value”)这个注解不可省略,value就是get方式的参数名了。如果省略则这里获取不到之后消费者通过feign请求的参数值。
@GetMapping("getuser")
public User getUser(@RequestParam("id") int id){
User user = new User();
user.setId(id);
user.setName("mt"+id);
return user;
}
另外post方法参数是一个对象时,一定要使用@RequestBody()注解,否则之后也是获取不到值。
消费者micro-cunsumer中的feign使用如下所示
@FeignClient("micro-provider")
public interface ProviderInterface {
@RequestMapping(value = "/api/getuser/{id}",method = RequestMethod.GET)
User getUser(@PathVariable("id") int id);
@RequestMapping(value = "/api/register",method = RequestMethod.POST)
User register(@RequestBody User user);
}
定义接口,在接口上使用@FeignClient("value")注解,value是提供者注册在eureka中的名称。
这里的坑是:
1 只能使用@RequestMapping()注解,不能使用GetMapping()或PostMapping(),如果使用了,则会启动报错,说该方法没有指定HTTP请求方法
2 get方法一定要使用@PathVariable()注解,post方法当参数是对象时要使用@RequestBody()注解,否则这里获取不到参数。