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
相关产品推荐
相关产品推荐

