使用 Spring Boot Rest 转换为 JSON 时,Java LocalDateTime 被转换为整数数组 [重复]

Posted

技术标签:

【中文标题】使用 Spring Boot Rest 转换为 JSON 时,Java LocalDateTime 被转换为整数数组 [重复]【英文标题】:Java LocalDateTime being converted into an array of ints when being converted to JSON using Spring boot rest [duplicate] 【发布时间】:2020-08-22 19:58:02 【问题描述】:

我的代码如下

@Data 
@Document(collection = "models")
public class Model 
  @Field(value = "modelDt")
  private LocalDateTime modelDate;


@Data
public class ModelDTO 
  private LocalDateTime modelDate;


@RestController
@RequestMapping("/api/v1/model")
public class ModelController 

  @Autowired 
  ModelService modelService;

  @GetMapping
  public List<ModelDTO> getModels() 
    return modelService.getAllModels();
  


几乎在 JSON 响应以正确格式(如 yyyy-mm-ddT00:00:00 出现)的任何地方都使用了此功能,但在上述情况下,我以以下格式获取日期。

[
  
    "modelDate": [
    YYYY,
    MM, 
    DD, 
    00,
    00,
    0000
    ]
  
]

我已将我的代码与返回正确格式的代码进行了交叉检查。

【问题讨论】:

【参考方案1】:

在日期字段上使用下面的杰克逊注释

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")

【讨论】:

这行得通。为什么在上述情况下它是必需的,而其他模型不需要任何此类注释。有没有办法可以避免这个注释并仍然得到想要的结果? @Pi53 你能展示它自动工作的模型吗?【参考方案2】:

如果您希望 LocalDateTime 始终以任何格式序列化,请遵循解决方案。

您可以为 LocalDateTime 创建一个序列化程序并将其添加到ObjectMapper。然后始终使用 JacksonLocalDateTimeSerializer 对 LocalDateTime 进行序列化。

public class JacksonLocalDateTimeSerializer extends StdSerializer<LocalDateTime> 

  private static final long serialVersionUID = 1355852411036457107L;

  private static final DateTimeFormatter formatter =
      DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

  public JacksonLocalDateTimeSerializer() 
    this(null);
  

  protected JacksonLocalDateTimeSerializer(Class<LocalDateTime> type) 
    super(type);
  

  @Override
  public void serialize(LocalDateTime value, JsonGenerator jsonGenerator,
      SerializerProvider serializerProvider) throws IOException 
    jsonGenerator.writeString(formatter.format(value));
  


并将其添加到 ObjectMapper 以自动申请 LocalDateTime 字段以获取所有回复。

@Configuration
public class JacksonConfig 

  @Bean
  @Primary
  public ObjectMapper configureObjectMapper() 
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(LocalDateTime.class, new JacksonLocalDateTimeSerializer());
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(javaTimeModule);
    return objectMapper;
  

【讨论】:

以上是关于使用 Spring Boot Rest 转换为 JSON 时,Java LocalDateTime 被转换为整数数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 REST Web 服务和 Spring Boot 将 servlet 中的应用程序转换为 Spring 吗?

如何在Spring Boot Rest API中的BeanUtils.copyProperties中将String转换为枚举

在 Spring Boot jpa 中将延迟加载的对象转换为 JSON

将现有的 Spring 应用程序转换为 Spring-Boot

无法从 Spring Boot REST 中的 Hibernate POJO 返回 JSON

处理自定义转换器抛出的 Spring Boot REST 异常