2018-4-24Feign踩坑

今天学习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()注解,否则这里获取不到参数。








猜你喜欢

转载自blog.csdn.net/titymt/article/details/80068280