Feign 客户端:执行 POST form-urlencoded 时,有效负载对象的最终字段未序列化

问题描述 投票:0回答:1

在我的代码中,我有简单的 Feign 客户端:

@FeignClient(name = "client", url = "${spring.microservice.tenant-auth.host}")
public interface PerTenantTokenClient {

  @PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
  ResponseEntity<AuthenticationResponse> getAuthToken(AuthFormData formData);

}

旨在执行以下请求:

POST https://myhost.net/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type = client_credentials &
client_id = id &
client_secret = secret

getAuthToken()
方法接受负载 DTO,描述为:

@RequiredArgsConstructor
public class AuthFormData {
  private final String grant_type;
  private final String client_id;
  private final String client_secret;
}

当我运行此代码片段时:

AuthFormData authFormData = new AuthFormData("client_credentials", "id", "secret");
var authTokenResponse = client.getAuthToken(authFormData);

意外失败,返回 400:

[400 Bad Request] during [POST] to [https://myhost.net/oauth/token] [PerTenantTokenClient#getAuthToken(AuthFormData)]: [{
  "error" : "invalid_request",
  "error_description" : "Missing parameter: grant_type"
}]

但是,如果我从

final
字段声明中删除
AuthFormData
,相同的代码会成功。

我尝试将

AuthFormData
声明为 Java 记录,但它也失败了(显然是由于记录成员上隐式的
final
)。

所以我的问题是我是否面临假客户端中的错误或者我的代码有问题?我使用

io.github.openfeign:feign-core:13.1
和 Java 21

java spring-cloud-feign feign openfeign
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.