Resteasy接口返回Java.util.Date为数字格式的问题排查
问题分析与解决
核心问题
你的REST API返回时间戳而非格式化日期,主要由以下几个原因导致:
1. 依赖混乱与冲突
- 同时引入了**Jersey(GlassFish的JAX-RS实现)和Resteasy(JBoss的JAX-RS实现)**的依赖,两者属于不同的JAX-RS实现框架,会导致JSON序列化逻辑冲突,实际生效的序列化器不符合预期。
- 重复引入了
jersey-media-json-jackson依赖,且Resteasy的Jackson provider版本(2.3.10.Final)与Resteasy客户端版本(3.9.3.Final)不匹配,版本不一致引发序列化行为异常。 - 引入了
jersey-media-moxy(Jersey默认的JSON序列化器),MOXy默认会将Date类型序列化为时间戳,且可能在依赖优先级上抢占了Jackson的处理权。
2. 缺少日期格式化配置
即使使用Jackson作为序列化器,其默认行为也是将Date输出为时间戳,需要显式配置日期格式化规则。
解决方案
第一步:清理并统一依赖
移除所有Jersey相关依赖,仅保留Resteasy生态的依赖,并确保版本统一。修改后的pom.xml依赖示例:
<dependencies> <!-- Resteasy核心容器(根据你的运行容器调整,此处以基础核心为例) --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>3.9.3.Final</version> </dependency> <!-- Resteasy Jackson2 JSON序列化支持 --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson2-provider</artifactId> <version>3.9.3.Final</version> </dependency> <!-- Resteasy客户端(如果业务需要保留) --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-client</artifactId> <version>3.9.3.Final</version> </dependency> </dependencies>
注意:如果使用Grizzly容器,替换为
resteasy-grizzly相关依赖,确保所有Resteasy组件版本完全一致。
第二步:配置日期格式化
有两种方式实现日期格式化:
方式1:局部注解(针对单个方法)
在返回Date的方法上添加Jackson的@JsonFormat注解,指定日期格式:
import com.fasterxml.jackson.annotation.JsonFormat; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import java.util.Date; @Path("/test") public class TestResource { @GET @Produces("application/json") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") public Date test() { return new Date(); } }
方式2:全局配置(所有日期类型生效)
创建Jackson配置类,自定义ObjectMapper并注册到Resteasy:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; import java.text.SimpleDateFormat; @Provider public class JacksonConfig implements ContextResolver<ObjectMapper> { private final ObjectMapper objectMapper; public JacksonConfig() { objectMapper = new ObjectMapper(); // 配置全局日期格式 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 适配Java 8+时间API(如LocalDateTime) objectMapper.registerModule(new JavaTimeModule()); // 禁用默认的时间戳序列化 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); } @Override public ObjectMapper getContext(Class<?> type) { return objectMapper; } }
确保该配置类被Resteasy扫描到(可通过@ApplicationPath标注的应用类手动注册,或配置包扫描路径)。
内容的提问来源于stack exchange,提问作者reza ramezani matin
相关产品推荐
相关产品推荐

