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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:33:10