如何让Java 8时间类在Jersey JAX-RS客户端中正常工作?
配置Jersey HTTP客户端支持Java 8时间类型序列化/反序列化
方法1:自定义JacksonJaxbJsonProvider并注册到客户端
创建自定义Jackson JSON提供者,内置配置好JavaTimeModule的ObjectMapper,再将其注册到Jersey客户端:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; public class CustomJacksonJsonProvider extends JacksonJaxbJsonProvider { public CustomJacksonJsonProvider() { super(); ObjectMapper objectMapper = new ObjectMapper(); // 注册Java 8时间模块 objectMapper.registerModule(new JavaTimeModule()); // 可选:关闭默认的时间戳序列化,改用ISO格式字符串 // objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); setMapper(objectMapper); } }
构建客户端时注册该提供者:
import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.JerseyClient; import org.glassfish.jersey.client.JerseyClientBuilder; public class JerseyClientInitializer { public static JerseyClient getConfiguredClient() { ClientConfig config = new ClientConfig(); config.register(CustomJacksonJsonProvider.class); return JerseyClientBuilder.createClient(config); } }
方法2:直接在ClientConfig中绑定自定义ObjectMapper
无需创建自定义提供者,通过AbstractBinder将配置好的ObjectMapper绑定到客户端:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.JerseyClient; import org.glassfish.jersey.client.JerseyClientBuilder; import org.glassfish.jersey.internal.inject.AbstractBinder; public class JerseyClientInitializer { public static JerseyClient getConfiguredClient() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); // 可选:自定义时间格式 // objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); ClientConfig config = new ClientConfig(); config.register(JacksonFeature.class); // 绑定自定义ObjectMapper config.register(new AbstractBinder() { @Override protected void configure() { bind(objectMapper).to(ObjectMapper.class); } }); return JerseyClientBuilder.createClient(config); } }
依赖兼容性说明
确保jackson-datatype-jsr310的版本与Jersey依赖的Jackson版本一致,避免版本冲突:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>对应Jackson版本号</version> </dependency>
内容的提问来源于stack exchange,提问作者Nicholas DiPiazza
相关产品推荐
相关产品推荐

