java 无法在springboot中将DateTime作为post请求的请求体(Json)中的输入

vltsax25  于 2023-04-28  发布在  Java
关注(0)|答案(3)|浏览(116)

如何将日期时间作为后Map控制器的请求体中的输入。
这是我的控制器,它正在获取对象DTO的请求体。

@PostMapping(value = "/filterJobs")
    @ResponseStatus(HttpStatus.OK)
    public ApiResponse getFilteredJobs(@RequestParam(defaultValue = "0") Integer pageNo,
                                       @RequestParam(defaultValue = "20") Integer pageSize,
                                       @RequestBody FilteredJobsDto filteredJobsDto) {

        Code here but its coming even to the first line of code
    }

我在请求体中使用FilteredJobsDto,该请求体具有以下参数

public class FilteredJobsDto implements Serializable {

    private String jobName;

    private Long createdBy;

    private String status = "submitted";

    private String tenantId;
   
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
    @JsonDeserialize(using = DateTimeDeserializer.class)
    private DateTime startDate;
    
    @DateTimeFormat(pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
    private DateTime endDate;
}

我的json body现在看起来像这样:

{
    "jobName": "email notification",
    "startDate": "2023-03-02T08:20:11.000Z",
    "status": "submitted"
}

我在这里面临的错误是 Postman 和控制台端的错误请求:

logException : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 3 column 19 path $.startDate; nested exception is com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 3 column 19 path $.startDate]

当我没有在json body中使用startDate时,API工作正常,但只要我输入“startDate”:“2023-03-02T08:20:11。000 Z”这个在我的json正文中,它抛出了一个错误。
谁能帮我解决这个问题!

gzszwxb4

gzszwxb41#

看起来你正在使用一些过时的类。在当前的Java包java.你会发现你需要的一切:

import java.time.LocalDateTime;

private LocalDateTime startDate;
8nuwlpux

8nuwlpux2#

你能试试这个吗?我有同样的请求体和下面的工程罚款为我

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss[.SSSSSS]XXX")
private DateTime startDate;

编辑

import java.time.ZonedDateTime;
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss[.SSSSSS]XXX")
  private ZonedDateTime startOn;
fjaof16o

fjaof16o3#

Sping Boot 默认提供良好的日期转换。您可以使用LocalDateTime来实现这一点,而不需要任何额外的依赖项。

public class Sample {
    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    LocalDateTime startDate;
}

默认情况下,Jackson不能使用Joda-Time。您需要注册JodaModule才能与Jackson一起使用Joda-Time。您可以添加此配置以让Sping Boot 在启动时注册它。

@Configuration
public class JacksonConfiguration {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.modules(new JodaModule());
    }
}

在ObjectMapper中注册Joda模块后,可以使用它将请求转换为模块。

public class Sample {
    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
    DateTime startDate;
}

相关问题