最近在做一个微服务的项目,项目中用的Feign来做服务件调用,由于自己也是第一次使用,记录一下自己遇到的坑。
启动类加入注解:
@EnableRyFeignClients
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
客户端接口类:
package com.dlzx.pfservercar.client;
import com.dlzx.common.core.web.domain.AjaxResult;
import com.dlzx.common.core.web.page.TableDataInfo;
import com.dlzx.pfservercar.domain.DVacation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@Component
@FeignClient(value = "pfserver-person") //注册中心服务的名字
//@FeignClient(value = "pfserver-person",url = "http://localhost:9500/") //本地调试
public interface PersonClient {
/**
* App 考勤-驾驶员请假列表
* */
@RequestMapping(path = "/vacation/E01VacationList",method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public TableDataInfo E01VacationList(@RequestBody DVacation dVacation);
/**
* App 考勤-请假详情(区分四种状态)
*/
@RequestMapping(path = "/vacation/E02VacationDetail")
public AjaxResult E02VacationDetail(@RequestParam("id") String id);
}
消费端Controller:
/**
* 驾驶员-考勤Controller
*
* @author dcl
* @date 2020-11-30
*/
@RestController
@RequestMapping("/driver-api/vacation")
public class DVacationController extends BaseController
{
@Autowired
private PersonClient personClient;
/**
* App 考勤-驾驶员请假列表
*/
@RequestMapping("/E01VacationList")
@ResponseBody
@Log(title = "考勤-驾驶员请假列表")
public TableDataInfo list(@RequestBody DVacation dVacation)
{
return personClient.E01VacationList(dVacation);
}
服务提供端Controller:
/**
* App 考勤-驾驶员请假列表
* */
@RequestMapping(path = "/E01VacationList",method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@ResponseBody
@Log(title = "App 考勤-驾驶员请假列表")
public TableDataInfo vacationList(@RequestBody DVacation dVacation)
{
startPage(dVacation.getPageNum(),dVacation.getPageSize());
LoginDriver loginDriver = driverTokenService.getLoginDriver();
dVacation.setDriverId(loginDriver.getUserid()+"");
return getDataTable(dVacationService.queryAppVacationList(dVacation));
}
一开始都还好好的,当传入多个@RequestParam参数时,突然遇到一个错误“Required String parameter ‘XXX’ is not present” 结果是因为我传入的参数有一个是空的,就会导致这个报错,如果参数可能为空的时候避免报错,可以参考我的。
将@RequestParam(“type”) 改为
@RequestParam(value = “type”,required = false)
可以解决此问题。
/**
* 管理员公共接口-消息节点
*/
@RequestMapping(path = "/administrator-app/msg/addAdminMsg",method = RequestMethod.POST)
public AjaxResult addAdminMsg(@RequestParam(value = "type",required = false)Long type, @RequestParam(value = "relationId",required = false)String relationId,
@RequestParam(value = "title",required = false)String title, @RequestParam(value = "content",required = false)String content);
这个参数是 required 确定在 API 中的参数中是否必须要输出参数。在默认情况下为 true,你可以设置这个参数为 false。如果你设置的参数为 true,但是在提交参数的时候没有提交这个参数,你的 API 将会返回一个异常。