You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus REST Client:如何为查询参数自定义日期格式化

解决REST Client中LocalDate查询参数格式化为yyyyMMdd的问题

你遇到的问题核心是默认的日期格式化规则不匹配API要求,且@DateFormat注解并非所有REST客户端框架都支持,以下是主流框架的针对性解决方案:

一、Spring框架(RestTemplate/WebClient)

1. 全局统一配置日期格式

通过配置转换器,让所有LocalDate类型的查询参数都使用指定格式:

@Configuration
public class RestClientConfig {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        
        // 处理请求体/响应体的日期序列化
        for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
            if (converter instanceof MappingJackson2HttpMessageConverter jsonConverter) {
                JavaTimeModule timeModule = new JavaTimeModule();
                timeModule.addSerializer(LocalDate.class, 
                    new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyyMMdd")));
                timeModule.addDeserializer(LocalDate.class, 
                    new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyyMMdd")));
                jsonConverter.getObjectMapper().registerModule(timeModule);
                break;
            }
        }
        
        // 处理查询参数的格式化
        restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory() {
            @Override
            protected UriComponentsBuilder createUriComponentsBuilder() {
                return super.createUriComponentsBuilder()
                        .queryParamFormatter(DateTimeFormatter.ofPattern("yyyyMMdd"));
            }
        });
        return restTemplate;
    }
}

2. 单个参数单独配置

如果仅需给该接口的参数指定格式,使用Spring官方的@DateTimeFormat注解:

@GET
@Path("/atl/")
RestResponse<AtlResponse> getAtlResponse(
    @QueryParam("from") @DateTimeFormat(pattern = "yyyyMMdd") LocalDate from
);

二、JAX-RS框架(Jersey/RESTeasy/Quarkus REST Client)

1. 自定义参数转换器

实现ParamConverter和ParamConverterProvider来接管LocalDate的格式化逻辑:

// 日期转换器实现
public class LocalDateParamConverter implements ParamConverter<LocalDate> {
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");

    @Override
    public LocalDate fromString(String value) {
        return value == null ? null : LocalDate.parse(value, FORMATTER);
    }

    @Override
    public String toString(LocalDate value) {
        return value == null ? null : FORMATTER.format(value);
    }
}

// 转换器提供者,供框架识别
@Provider
public class LocalDateParamConverterProvider implements ParamConverterProvider {
    @SuppressWarnings("unchecked")
    @Override
    public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
        if (rawType.equals(LocalDate.class)) {
            return (ParamConverter<T>) new LocalDateParamConverter();
        }
        return null;
    }
}

2. 注册转换器到客户端

  • 手动创建客户端时注册:
Client client = ClientBuilder.newClient();
client.register(LocalDateParamConverterProvider.class);
// 后续用该client创建WebTarget发起请求
  • 注解式客户端(如Quarkus)直接指定转换器:
@GET
@Path("/atl/")
RestResponse<AtlResponse> getAtlResponse(
    @QueryParam("from") @Converter(converter = LocalDateParamConverter.class) LocalDate from
);

内容的提问来源于stack exchange,提问作者thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:05:03