Feign:今天学习SpringCloud的过程作,我在写查询方法的时候
服务器端的查询:
//模拟从数据库中取出数据
private static final List<UserInfo> USER_INFO_LIST = new ArrayList();
static {
USER_INFO_LIST.add(new UserInfo(1,"tom",21,"男"));
USER_INFO_LIST.add(new UserInfo(2,"jack",22,"男"));
USER_INFO_LIST.add(new UserInfo(3,"candy",23,"女"));
USER_INFO_LIST.add(new UserInfo(4,"rose",24,"女"));
}
@Override
@ResponseBody
@GetMapping(path = "/findAllEntity")
public List<UserInfo> findAll(UserInfo userInfo) {
//先将LIST转换成流,然后filter过滤,过滤得到对象中名字含有name的,最后重新转换为LIST
return USER_INFO_LIST.stream().filter(user -> {
boolean flag = true;
//如果名字不为空 判断接受的对象的名字是否在LIST里存在?
if (userInfo.getName() != null && !userInfo.getName().isEmpty()) {
if (!user.getName().contains(userInfo.getName())) {
return false;
}
//如果年龄不为空 判断接受的对象的年龄是否在LIST里存在?
if (userInfo.getAge()!=null) {
if(!user.getAge().equals(userInfo.getAge())) {
return false;
}
}
//如果性别不为空 判断接受的对象的性别是否在LIST里存在?
if (userInfo.getSex()!=null && !userInfo.getSex().isEmpty()) {
if (!user.getSex().contains(userInfo.getSex())) {
return false;
}
}
}
return true;
}).collect(Collectors.toList());
// return USER_INFO_LIST;
}
公共部分的接口(feign)(一般将数据库建在公共部分,所以将查询接口也可以写在这里)
/**
* @author L
* @FeignClient() 这里写的是服务器的地址
*/
@FeignClient(value = "USER-SERVER")
public interface UserInfoService {
@GetMapping(path = "/findEntity")
public List<UserInfo> findEntity(UserInfo userInfo);
}
客户端:
/**
* 这是客户端的访问controller
*/
@RestController
public class UserInfoController implements UserInfoService{
@Resource
private UserInfoService userInfoService;
public List<UserInfo> findEntity(UserInfo userInfo) {
return userInfoService.findEntity(userInfo);
}
}
按理说 我公共部分和服务器端都用的是get方式,是可以对应上的,但是问题出来了!
以下是我的错误!!!
后台报错:
feign.FeignException$MethodNotAllowed: [405] during [GET] to [http://USER-SERVER/findAllEntity] [UserInfoService#findAll(UserInfo)]: [{"timestamp":"2020-08-15T16:08:46.451+0000","status":405,"error":"Method Not Allowed","message":"Request method 'POST' not supported","path":"/findAllEntity"}]
这是因为feign会将get方式转换为post方式(而post方式默认是在参数前面加了注解@RequestBody的),以下是解决方式!!!(在不修改get post方式的前提下!)
@RequestBody:其实意思是前端传的是json数据!!!
get方式传参是直接在地址栏的查询字符串的方式! 而不是用RequestBody的方式。
以下是解决方式
1.bootstrap.yml中配置
2.加入依赖: