【问题标题】:Different behaviour on JAX-RS json (java.util.Date) serializationJAX-RS json (java.util.Date) 序列化的不同行为
【发布时间】:2024-01-15 06:27:01
【问题描述】:

我正在将我的应用程序 (Jee7) 从 Wildfly 9.0.1 迁移到 Wildfly 16.0.0。

我注意到两个 Wildfly 版本的 JAX-RS json (java.util.Date) 反序列化的响应不同。

是 bug 还是 Jee 规范改变了?

有没有办法为整个应用程序全局修复它?

示例类:

@ApplicationPath("/rest")
public class RestConfig extends Application {

}

@Path("/test")
public class TestResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public TestEntity get() {
        return new TestEntity(new Date());
    }
}

public class TestEntity {

    private Date dtTest;

    /* other fields */

    public TestEntity(Date dtTest) {
        super();
        this.dtTest = dtTest;
    }

    public Date getDtTest() {
        return dtTest;
    }


}

Wildfly 9.0.1 响应: {"dtTest":1558550586974}

Wildfly 16.0.0 响应: {"dtTest":"2019-05-22T18:44:47.268Z[UTC]"}

我希望获得 1558550586974 的“dtTest”作为 Wildfly 16 的响应。

【问题讨论】:

  • 貌似有SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS之类的设置,见*.com/questions/4428109/…。这有帮助吗?
  • Progman,感谢您的回答。它对我不起作用。但问题解决方案使用相同的策略 (ContextResolver),该策略位于:developer.jboss.org/thread/279220

标签: java jax-rs wildfly java-ee-7 wildfly-9


【解决方案1】:

https://developer.jboss.org/thread/279220找到的解决方案。

我将 pom.xml 依赖项从 Jee7 更改为 Jee8:

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>8.0</version>
            <scope>provided</scope>
        </dependency>

我创建了一个实现 ContextResolver 的提供程序

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;
import javax.json.bind.annotation.JsonbDateFormat;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JsonbDateConfig implements ContextResolver<Jsonb> {  
    private final Jsonb jsonB;  


    public JsonbDateConfig()  
    {  
        JsonbConfig config = new JsonbConfig();  
        config.setProperty(JsonbConfig.DATE_FORMAT, JsonbDateFormat.TIME_IN_MILLIS);  
        jsonB = JsonbBuilder.create(config);  
    }  


    @Override  
    public Jsonb getContext(Class objectType) {  
        return jsonB;  
    }  
}  

这样就解决了问题。

【讨论】: