填坑系列之OpenFeign(一)

JAVA学习网 2020-12-11 12:02:02

前提

使用OpenFeign构建微服务消费端,发送带参请求时,控制台报错:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.FeignException$InternalServerError: [500 ] during [GET] to [http://user-provider/user/isConsumerId] [UserConsumerService#isID(Integer)]: [{"timestamp":"2020-12-10T06:44:07.262+00:00","status":500,"error":"Internal Server Error","message":"","path":"/user/isConsumerId"}]] with root cause

方法

在传参数时需要添加@RequestParam(“paramName”),或者在调用的API的接口中添加@RequestParam(“paramName”)也可。

如果只在API中加@RequestPara(“paramName”),“paramName” 必须指定,否则,构建接口实例时报错。

如果在API和provider以及consumer相关参数前加@RequestPara(“paramName”)注解,则“paramName” 可以不指定。

ps:最好在API、provider、consumer相关参数前全加上@RequestParam

实例

以下为不同服务:

user-api:

@RequestMapping("/user")
public interface RegisterApi {

    @GetMapping("/isConsumerId")
    String isID(/*@RequestParam("id")*/ Integer id);
}

user-provider:

@RestController
public class UserController implements RegisterApi {

    @Override
    public String isID(Integer id) {
        if (id == 1) return "find " + id;
        else return "not find " + id;
    }
}

user-consumer:

package com.yiming.user_consumer.service;

@FeignClient(name = "user-provider")
public interface UserConsumerService extends RegisterApi {

    @GetMapping("/isConsumerId")
    String isID(@RequestParam("id") Integer id);
}
package com.yiming.user_consumer.controller;

@RestController
public class ConsumerFindIDController {

    @Autowired
    UserConsumerService consumerService;

    @GetMapping("/findById")
    public String findId(Integer id) {
        return consumerService.isID(id);
    }
}

原因

isID(@RequestParam("id") Integer id),实际上是交由Feign组装get请求 http://user-provider/isConsumerId?id={1},此时@RequestParam("id")是强制要求的,否则报错。

扩展:

若需动态传参,可将参数放入map中,如下所示:

user_api:

@RequestMapping("/user")
public interface RegisterApi {

    @GetMapping("/map")
    Map<String, Object> getMap(Map<String, Object> map);
}

user-provider:

@RestController
public class UserController implements RegisterApi {

    @Override
    public Map<String, Object> getMap(@RequestParam Map<String, Object> map) {
        System.out.println(map);
        return Collections.singletonMap(map.get("name").toString(), Integer.parseInt(map.get("age").toString()));
    }
}

user-consumer:

package com.yiming.user_consumer.service;

@FeignClient(name = "user-provider")
public interface UserConsumerService extends RegisterApi {

    @GetMapping("/map")
    Map<String, Object> getMap(@RequestParam Map<String, Object> map);
}
package com.yiming.user_consumer.controller;

@RestController
public class ConsumerFindIDController {

    @Autowired
    UserConsumerService consumerService;

    @GetMapping("/getMap")
    public Map<String, Object> getMap(@RequestParam Map<String, Object> map) {
        return consumerService.getMap(map);
    }
}

还有一个坑:

当传参为空时,get请求被Feign转为post请求。。。

阅读(1635) 评论(0)