micronaut HttpResponse 中的 ISO-8601(yyyy-MM-dd'T'HH:mm:ss.SSSXXX) 格式不起作用。
我们需要 yyyy-MM-dd'T'HH:mm:ss.SSSXXX 格式的日期,但是反序列化未按所需格式转换。
控制器
import com.fasterxml.jackson.core.JsonProcessingException;
import io.micronaut.http.*;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.scheduling.TaskExecutors;
import io.micronaut.scheduling.annotation.ExecuteOn;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
@AllArgsConstructor
@Controller
@Slf4j
@ExecuteOn(TaskExecutors.BLOCKING)
public class LogisticsController1 {
@Get("/test")
public Mono<HttpResponse<Object>> getRes() throws ParseException, JsonProcessingException {
String d="2024-05-01T19:52:33.411Z";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date date2=simpleDateFormat.parse(d);
TestDate date11=new TestDate();
date11.setDate(date2);
return Mono.just(buildResponse(date11));
}
public HttpResponse<Object> buildResponse(TestDate date11) throws JsonProcessingException {
return HttpResponse.status(HttpStatus.OK).body(date11);
}
}
DTO:
import io.micronaut.serde.annotation.Serdeable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Date;
@Setter
@Getter
@NoArgsConstructor
@Serdeable
public class TestDate {
//@JsonFormat( shape = STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
Date date;
}
API 响应:
实际:
{“日期”:“2024-05-01T19:52:33.411Z”}
预计
{ “日期”: “2024-05-02T01:22:33.411+05:30” }
======================================
尝试过的事情:
看起来 JsonFormat 不支持 ISO-8601,其他格式也可以工作。
@JsonFormat( shape = STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
Date date;
如果要以 ISO 格式显示时区偏移量,还需要在
timezone
注释中指定 @JsonFormat
属性。在您的情况下,由于 +5:30 对应于印度,如果您希望日期序列化为 { "date": "2024-05-02T01:22:33.411+05:30" }
,您可能需要按以下方式编写注释:
@ToString
public class TestDate {
@JsonFormat(shape = STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "Asia/Kolkata")
Date date;
}