The following client:
@FeignClient(
name = "tokenKeySignProxy",
url = "localhost:8080/tokens/{tokenId}/keys/{keyId}"
)
public interface TokenKeySignVerifyProxy {
@PostMapping(
value = "/sign",
consumes = MatosMediaType.V1_VALUE,
produces = MatosMediaType.V1_VALUE
)
SignResponse sign(
@PathVariable("tokenId") String tokenId,
@PathVariable("keyId") String keyId,
@RequestParam("mechanism") Mechanism signMechanism,
@RequestBody SignRequest signRequest
);
}
cannot be created. It fails with the following error:
Caused by: java.lang.IllegalStateException: Body parameters cannot be used with form parameters.
at feign.Util.checkState(Util.java:129) ~[feign-core-10.7.4.jar:na]
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:125) ~[feign-core-10.7.4.jar:na]
at org.springframework.cloud.openfeign.support.SpringMvcContract.parseAndValidateMetadata(SpringMvcContract.java:187) ~[spring-cloud-openfeign-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:62) ~[feign-core-10.7.4.jar:na]
at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:151) ~[feign-core-10.7.4.jar:na]
at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:49) ~[feign-core-10.7.4.jar:na]
at feign.Feign$Builder.target(Feign.java:252) ~[feign-core-10.7.4.jar:na]
at org.springframework.cloud.openfeign.HystrixTargeter.target(HystrixTargeter.java:38) ~[spring-cloud-openfeign-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:304) ~[spring-cloud-openfeign-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:262) ~[spring-cloud-openfeign-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
... 36 common frames omitted
I found two ways to get rid of this error:
1. Moving the variable declaration into @PostMapping annotation:
@PostMapping(
value = "/tokens/{tokenId}/keys/{keyId}/sign",
```
2. Moving `@RequestBody` annotation before all `@PathVariable` in method signature:
SignResponse sign( @RequestParam("mechanism") Mechanism signMechanism, @RequestBody SignRequest signRequest, @PathVariable("tokenId") String tokenId, @PathVariable("keyId") String keyId ```
Am I doing something wrong ?
Environment:
* spring-cloud-dependencies-Hoxton.SR3;
* spring-boot-starter-parent-2.2.6-RELEASE;
* spring-cloud-starter-openfeign-2.2.2-RELEASE
Comment From: OlgaMaciaszek
Hi, @3ric-T. This, indeed, happens. However, according to the javadoc for @FeignClient, the `url attribute should be used for providing an absolute URL or the hostname . Therefore, the path variable tokens, should not be used there. I suggest moving them to method path level.
Comment From: 3ric-T
Hi @OlgaMaciaszek
Thanks for the answer!
I will modify my code accordingly, I guess I will not play with @RequestBody and @PathVariable order in method signature.