티스토리 뷰

spring 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 으로 정의를 해줘야 한다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31