【发布时间】:2020-03-25 08:47:56
【问题描述】:
我正在学习使用 Spring 的 Feign Client,所以我构建了两个简单的项目(serviceA 和 serviceB)来测试它。我有以下代码:
serviceA 休息接口:
@RequestMapping("/users")
public interface UserRest {
@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody User user, BindingResult br);
}
serviceArest接口实现:
@RestController
public class UserController implements UserRest {
@Override
@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody User user, BindingResult br) {
// validate user
// persist user
return ResponseEntity.ok(user);
}
}
serviceA feign 客户端声明:
@FeignClient(value = "serviceA", decode404 = true)
public interface UserFeignClient extends UserRest {}
现在,当我将 UserFeignClient 的实例自动连接到我的 serviceB 中时,当我的 REST 方法采用单个参数时,我可以很好地使用它。但是,当我尝试像上面一样使用 BindingResult 验证参数时,出现以下异常:
java.lang.IllegalStateException: Method has too many Body parameters: public abstract org.springframework.http.ResponseEntity com.mypackage.servicea.api.UserRest.createUser(org.apache.catalina.User,org.springframework.validation.BindingResult)
为什么 Feign 认为 BindingResult 是第二个 Body 实体?有没有办法解决这个问题?
【问题讨论】:
-
您找到解决方案了吗?
-
不,我很确定 feign 不支持带有 BindingResult 参数的方法,或者至少在我尝试它时它没有返回。最后我不得不删除 BindingResult 并创建一个自定义验证器(docs.spring.io/spring/docs/4.1.x/spring-framework-reference/…),然后将它绑定到我的控制器(docs.spring.io/spring/docs/4.1.x/spring-framework-reference/…)
标签: spring-mvc spring-cloud spring-cloud-feign feign openfeign