是否可以为spring的HttpInterface配置转换器?

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

假设我给出了以下端点:

GET /hello/{id}?idType={idType}

其中 idType 的允许值为 ["loginId", "contactId"]

我必须使用此服务:

@HttpExchange("/hello")
public interface HelloClient {
    @GetExchange("/{id}")
    String hello(@PathVariable String id, @RequestParam IdType idType);
}

其中 IdType 是一个枚举:

public enum IdType {
    LOGIN_ID("loginId"),
    CONTACT_ID("contactId");
    String idType;
    IdType(String idType) { this.idType = idType; }
}

通常可以定义一个 Converter bean,我想 Spring 会使用它来实现它的魔力并发送正确的请求:

GET /hello/xyz?idType=loginId

我怎样才能用 HttpInterfaces 做同样的事情?

helloClient.hello("xyz", IdType.LOGIN_ID);
expected: GET /hello/xyz?idType=loginId
actual: GET /hello/xyz?idType=LOGIN_ID

我不想拥有此代码:

helloClient.hello("xyz", IdType.LOGIN_ID.getIdType());

这样的事情可能吗?转换器好像没用过。

java spring spring-boot
1个回答
0
投票

定义了 HTTP 接口后,我们必须创建 RestClient、WebClient 或 RestTemplate 类型的代理。是的,我们可以仅在我们创建的代理对象上注册 HttpMessageConverters ,也可以通过将其注册为 bean 来全局注册 HttpMessageConverters 。这将使我们可以添加或修改我所看到的

正文和标题

中的内容。

在我们的例子中,我们现在想要修改查询参数,我认为转换器无法完成此操作。所以我能想到的一种方法是添加一个拦截器,就像我在创建 RestClient 代理时添加的那样。

@Bean public UtilityClient createClient () { RestClient restClient = RestClient.builder() .baseUrl("http://localhost:8080/") .requestInterceptors(interceptorsConsumer -> { interceptorsConsumer.add( (request, body, execution) -> { String query = request.getURI().getQuery(); // our modification code here. return execution.execute(request, body); } ); }) .build(); RestClientAdapter adapter = RestClientAdapter.create(restClient); HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build(); UtilityClient service = factory.createClient(UtilityClient.class); return service; } 我们可以在拦截器中添加修改查询参数的逻辑。但我确实觉得修改字符串可能会“不稳定且不可预测”。我很想看看是否有人有其他方法可以做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.