Feign傳參注意
最近在用SpringCloud嘗試重構以前的項目秽晚,使用Feign客戶端組件來調用微服務瓦糟,經(jīng)常出現(xiàn)參數(shù)傳不過去變成null的問題,網(wǎng)上查了一下發(fā)現(xiàn)feign在參數(shù)上的使用還是有一定的限制的赴蝇,主要是要注意:
當參數(shù)比較復雜時菩浙,feign即使聲明為get請求也會強行使用post請求
不支持@GetMapping類似注解聲明請求,需使用@RequestMapping(value = "url",method = RequestMethod.GET)
使用@RequestParam注解時必須要在后面加上參數(shù)名
寫了一個簡單案例,同時傳輸一個對象和一個字符串作為請求參數(shù)劲蜻,
消費端controller
package com.taotao.feignchuanzhi.controller;
import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList;
import com.taotao.feignchuanzhi.entity.User;
import com.taotao.feignchuanzhi.service.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class FeignController {
@Autowired
private FeignService feignService;
//String 類型傳值通過feign傳遞
@RequestMapping("/getOrderName")
public String getOrderName(String name){
return feignService.getName(name);
}
/**
* feign 多個參數(shù)傳值
* @param name
* @param pass
* @return
*/
@RequestMapping("/getOrderNameMore")
public String getOrderNameMore(String name,String pass){
return feignService.getNameMore(name,pass);
}
/**
* feign 傳遞 model 類型的值
* @param user
* @return
*/
@RequestMapping("/getuserOrder")
public String user(User user){
return feignService.getUser(user);
}
}
feignService
package com.taotao.feignchuanzhi.service;
import com.taotao.feignchuanzhi.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient("app-itmayiedu-member")
public interface FeignService {
/**
* feign 傳遞 string 類型的值
* @RequestParam("name") String name 必須要有
* 也可以 @RequestParam(value="name") String name + value
*
* @param name
* @return
*/
@RequestMapping("/getName")
public String getName(@RequestParam("name") String name); //必須加上@RequestParam("name") 才能傳值
/**
* feign 多個參數(shù)傳值
* @param name
* @param pass
* @return
*/
@RequestMapping("/getNameMore")
public String getNameMore(@RequestParam("name") String name,@RequestParam(value="pass") String pass); //必須加上@RequestParam("name") 才能傳值
/**
* feign 傳遞 model 類型的值
* @param user
* @RequestBody 必須要有
* @return
*/
@RequestMapping("/getUser")
public String getUser(@RequestBody User user);
}
會員端被調用的controller
package com.taotao.springcloud_erueka_member.controller;
import com.taotao.springcloud_erueka_member.entity.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
public class MemberController {
@Value("${server.port}")
private String port;
@RequestMapping("/getMember")
public String getMember(){
return "this is getMember,端口為:" +port;
}
/**
* 傳遞 String 類型的值
* @param name
* @return
*/
@RequestMapping("/getName")
public String getName(String name){
return "feign傳遞參數(shù)"+name;
}
/**
* feign 多個參數(shù)傳值
* @param name
* @param pass
* @return
*/
@RequestMapping("/getNameMore")
public String getNameMore(@RequestParam("name") String name, @RequestParam(value="pass") String pass){
return "feign傳遞多參數(shù)的值"+name+pass;
}
/**
* feign 傳遞 module l類型的值
* @param user
* @return
*/
@RequestMapping("/getUser")
public String getUser(@RequestBody User user){
return "feign傳遞model類型的值"+user.getName()+user.getPass();
}
}