groovy 控制器返回Micronaut控制器中JSON格式的LocalDateTime

wfsdck30  于 2022-11-21  发布在  其他
关注(0)|答案(2)|浏览(160)

环境 :

  • 微型 机 : 3.7.3
  • Java : 开放 式 JDK 11.0.16
  • 外观 : 3.0.13

My Controller 是 用 Groovy 实现 的 , 如下 所 示 :

@Controller("/")
@Slf4j
class Controller1 {
    @Get(uri="/test-localdatetime", produces = MediaType.APPLICATION_JSON)
    HttpResponse<String> testLocalDateTime() {
        LocalDateTime now = LocalDateTime.now()
        def map = [
                status: "SSUCCESS",
                time: now
        ]
        return HttpResponse.ok(map)
    }
}

中 的 每 一 个
当 我 呼叫 它 时 , 它 会 传回 :

{"status":"SSUCCESS","time":[2022,11,2,8,24,13,948454300]}

格式
如果 我 想 让 它 返回 一 个 如下 所 示 的 美化 JSON , 我 可以 添加 以下 代码

String json = new JsonBuilder(map).toPrettyString()
return HttpResponse.ok(json)

格式
而 回应 会 变成 ( 仍然 不 是 我 想 要 的 ) :

{
    "status": "SSUCCESS",
    "time": {
        "month": "NOVEMBER",
        "second": 29,
        "hour": 8,
        "nano": 944749300,
        "year": 2022,
        "dayOfMonth": 2,
        "minute": 44,
        "monthValue": 11,
        "dayOfWeek": "WEDNESDAY",
        "chronology": {
            "calendarType": "iso8601",
            "id": "ISO"
        },
        "dayOfYear": 306
    }
}

格式
但 我 想要 的 想法 回应 是 以下 格式 :

{
  "status":"SSUCCESS",
  "time":"2022-11-02 08:24:13"
}

格式
所以 , 我 想 知道 是否 有 一 种 简单 的 方法 , 通过 添加 一些 配置 或 注解 , 而 不 改变 初始 代码 , 达到 上述 想法 格式 ?

0g0grzrc

0g0grzrc1#

您需要在应用程序中自己配置Jackson序列化。yml

jackson:
   dateFormat: yyyyMMdd
   timeZone: UTC
   serialization:
     writeDatesAsTimestamps: false

顺便说一下,我强烈建议使用java.time.Instant而不是java.time.LocalDateTime
此外,我会将控制器的返回类型更改为返回Map而不是String,这样框架就可以关注对Map的序列化,因为返回的是Map而不是字符串。

@Controller("/")
@Slf4j
class Controller1 {
    @Get(uri="/test-localdatetime", produces = MediaType.APPLICATION_JSON)
    HttpResponse<Map> testLocalDateTime() {
        LocalDateTime now = LocalDateTime.now()
        def map = [
                status: "SSUCCESS",
                time: now
        ]
        return HttpResponse.ok(map)
    }
}
wvt8vs2t

wvt8vs2t2#

当您只在一个位置使用日期/时间,或需要在不同位置使用不同格式时,您可以:

返回DTO,您可以在其中按注解设置格式

示例DTO类

import com.fasterxml.jackson.annotation.JsonFormat
import java.time.LocalDateTime

class SomeResponse {
    String status
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    LocalDateTime time
}

控制器方法:

@Get(uri="/test-localdatetime", produces = MediaType.APPLICATION_JSON)
SomeResponse testLocalDateTime() {
    new SomeResponse(
        status: "SSUCCESS",
        time: LocalDateTime.now()
    )
}

继续使用Map,但手动转换时间值

控制器变更:

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

@Get(uri="/test-localdatetime", produces = MediaType.APPLICATION_JSON)
Map testLocalDateTime() {
    def now = LocalDateTime.now()
    [
        status: "SSUCCESS",
        time: formatter.format(now)
    ]
}

相关问题