将当前时区设置为 @JsonFormat 时区值

Vis*_*u K 7 java timezone json dto spring-data-jpa

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = "Asia/Kolkata")
private Date activationDate;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

请帮我解决这个问题。

提前致谢,毗湿奴

xon*_*nya 13

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

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = JsonFormat.DEFAULT_TIMEZONE)
Run Code Online (Sandbox Code Playgroud)

从文档:

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

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

为了配置ObjectMapper

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = JsonFormat.DEFAULT_TIMEZONE)
Run Code Online (Sandbox Code Playgroud)

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

-Duser.timezone=Asia/Kolkata
Run Code Online (Sandbox Code Playgroud)

  • 不完全正确。见 /sf/answers/3865800851/ (4认同)

Raj*_*rma 5

您不能为时值分配动态值或运行时值。它应该是常量或编译时值,并且枚举也被接受。

所以你应该为timezone分配一个常量。像下面。

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