티스토리 뷰
Framework/Spring
Openfeign 사용시 IllegalStateException: Method has too many Body parameters 오류 조치
호형 2021. 3. 2. 18:55spring cloud openfeign 을 사용하는데 오류가 발생하였다.
Caused by: java.lang.IllegalStateException: Method has too many Body parameters: public abstract byte[] com.example.demo.testFeign.encryption(java.lang.String,java.lang.String,java.lang.String)
Warnings:
-
at feign.Util.checkState(Util.java:129) ~[feign-core-10.10.1.jar:na]
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:127) ~[feign-core-10.10.1.jar:na]
at org.springframework.cloud.openfeign.support.SpringMvcContract.parseAndValidateMetadata(SpringMvcContract.java:194) ~[spring-cloud-openfeign-core-3.0.0.jar:3.0.0]
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:62) ~[feign-core-10.10.1.jar:na]
at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:151) ~[feign-core-10.10.1.jar:na]
IllegalStateException: Method has too many Body parameters 오류이다. parameters가 너무 많다는 것이다.
오류는 interface를 정의할 때 발생을 하였다. 오류가 났을때의 코드는 아래와 같다.
@FeignClient(value = "test", url = "http://localhost:8770")
public interface testFeign {
@PostMapping("/encryption")
byte[] encryption(String id, String name, String ip);
@PostMapping("/decryption")
byte[] decryption(String id, String name, String ip);
}
위와 같은 코드는 다음과 같은 모습으로 바뀌어야 한다.
@FeignClient(value = "test", url = "http://localhost:8770")
public interface testFeign {
@PostMapping(value="/encryption")
byte[] encryption( @RequestParam("id") String id, @RequestParam("name") String name, @RequestParam("ip") String ip);
@PostMapping(value="/decryption")
byte[] decryption( @RequestParam("id") String id, @RequestParam("name") String name, @RequestParam("ip") String ip);
}
openfeign에서 interface를 정의할때 위와 같이 primitive type 의 parameter인 경우에는 @RequestParam을 앞에 넣어줘야 한다.
참고로 다음과 같이 사용자 정의 모델을 두가지로 정의하는 경우가 있다.
public int save(@RequestBody final Person p, @RequestBody final UserModel user);
모델을 받을때는 @RequestBody로 받아야 하는데 위와 같이 모델이 2개일때는 문제가 생긴다. feign에서는 하나의 @RequestBody만 허용이 가능하다. 따라서 위와 같은 상황에서는 다음과 같이 사용해야 한다.
public int save(@RequestBody final Person p,@RequestParam("userId") String userId,@RequestParam("userTel") String userTel);
하나는 @RequestBody를 사용하되 다른 하나는 쪼개서 @RequestParam 으로 정의를 해줘야 한다.
끝!
'Framework > Spring' 카테고리의 다른 글
댓글