在我的代码中,我有简单的 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