首页 > 解决方案 > 是否可以全局设置 JSON-B (Yasson) 中的默认日期格式,而不是在每个属性上添加注释?

问题描述

到目前为止,我一直在使用 Jersey,并且正在使用 JSON-B 进行我的第一个实现。

我正在使用 Payara,所以我与 Jersey 和 Yasson 合作。我遇到了一个问题,因为序列化的日期总是包含“[UTC]”后缀。

我设法在我的 DTO 中对我的日期属性使用了注释。但我想全局配置(在 JAX-RS 应用程序配置中?),而不是在每个日期属性上重复自己。那可能吗?到目前为止我还没有找到任何东西...

附带问题:我认为可以去掉这个“[UTC]”后缀,因为它会破坏所有试图解析日期的客户端。任何想法?

标签: jerseyjax-rspayarajsonb-apiyasson

解决方案


感谢这个Github 问题,我能够解决我的问题。这是我最终在代码中编写的内容:

JSONConfigurator.java:

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;
import javax.json.bind.config.PropertyNamingStrategy;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
public class JSONConfigurator implements ContextResolver<Jsonb> {

  @Override
  public Jsonb getContext(Class<?> type) {
    JsonbConfig config = getJsonbConfig();
    return JsonbBuilder
      .newBuilder()
      .withConfig(config)
      .build();
  }

  private JsonbConfig getJsonbConfig() {
    return new JsonbConfig()
      .withDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", null);
  }
}

和:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

@ApplicationPath("/api")    
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<Class<?>>();
        addRestResourceClasses(resources);
        resources.add(JSONConfigurator.class);
        return resources;
    }


    private void addRestResourceClasses(Set<Class<?>> resources) {
      ...
    }

}

推荐阅读