【问题标题】:Set Current TimeZone to @JsonFormat timezone value将当前时区设置为 @JsonFormat 时区值
【发布时间】:2018-02-11 04:41:33
【问题描述】:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = "Asia/Kolkata")
private Date activationDate;

从上面的 java 代码中,我想使用以下方法将时区值设置为当前系统时区: TimeZone.getDefault().getID() - 它返回值为 "Asia/Kolkata"

但如果我将此代码设置为 json 格式

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = TimeZone.getDefault().getID())

我收到类似 “注释属性 JsonFormat.timezone 的值必须是常量表达式”的错误

请帮我解决这个问题。

提前致谢, 毗湿奴

【问题讨论】:

  • 我认为你必须为这个任务定义一个反序列化器,但还没有尝试过。我也是这种情况。如果您有什么问题,请在下面附上您的解决方案,谢谢。
  • 您对此有什么解决方案吗?如果是,请更新

标签: java json timezone spring-data-jpa dto


【解决方案1】:

您可以使用JsonFormat.DEFAULT_TIMEZONE正确配置ObjectMapper后

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = JsonFormat.DEFAULT_TIMEZONE)

来自文档:

指示应使用默认 TimeZone(来自反序列化或序列化上下文)的值:注释未定义要使用的值。

注意:这里的默认值并不意味着 JVM 默认值,而是 Jackson 数据绑定默认值,通常是 UTC,但可以在 ObjectMapper 上更改。

为了配置ObjectMapper

@Configuration
public class MyApp {

    @Autowired
    public void configureJackson(ObjectMapper objectMapper) {
        objectMapper.setTimeZone(TimeZone.getDefault());
    }
}

要在您的应用程序上设置默认时区,请使用此 JVM 属性:

-Duser.timezone=Asia/Kolkata

【讨论】:

【解决方案2】:

您不能将 timezone 值指定为动态值或运行时值。它应该是常量或编译时值,并且 enums 太被接受了。

因此,您应该为 timezone 分配一个常量。如下所示。

private static final String MY_TIME_ZONE="Asia/Kolkata";
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = MY_TIME_ZONE);

【讨论】:

  • 嗨 Raju Sharma,我想将时区设置为系统的当前时区,不需要像“亚洲/加尔各答”这样分配常数值。谢谢
【解决方案3】:

您可以使用枚举来丰富您将使用的时区。使用枚举的解决方案是下面的枚举类实现。

    package <your package goes here>;

    import java.util.TimeZone;


    public enum TimeZoneEnum {

        DEFAULT(TimeZone.getDefault()),
        ASIA_KOLKATA = (TimeZone.getTimeZone("Africa/Abidjan")),
        //other timezones you maybe need
        ...


    private final TimeZone tz;

        private TimeZoneEnum(final TimeZone tz)
        {
            this.tz = tz;
        }

        public final TimeZone getTimeZone()
        {
            return tz;
        }
    }

然后你可以像下面这样使用你的枚举:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = TimeZoneEnum.ASIA_KOLKATA )

【讨论】:

  • 谢谢老兄,使用上面的代码,我仍然得到同样的错误“注释属性 JsonFormat.timezone 的值必须是一个常量表达式”
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2019-12-15
相关资源
最近更新 更多