【问题标题】:Use LocalDateTime in Micronaut Kotlin Data Class DTO在 Micronaut Kotlin 数据类 DTO 中使用 LocalDateTime
【发布时间】:2020-09-13 19:08:22
【问题描述】:

我得到了这个 DTO:

@Introspected
data class SomeDTO(
        val someLocalDateTime: LocalDateTime,
        val someString: String
)

我想在这样的 Micronaut 控制器中使用它:

@Post
@Status(HttpStatus.CREATED)
fun somePostCall(
    someDTO: SomeDTO,
    authentication: Authentication
) {
    this.someMethodCall(
            someDTO.someString,
            someDTO.someLocalDateTime,
            authentication.name
    )
}

我总是遇到这个错误:

未指定必填参数 [SomeDTO someDTO]

我已经尝试使用 @JsonFormat、@Format 和自定义 TypeConverter(字符串到 LocalDateTime)来注释 DTO 中的值,但它们都不起作用。

【问题讨论】:

    标签: kotlin micronaut


    【解决方案1】:

    试试看 ;-)

    data class SomeDTO(
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
            val someLocalDateTime: LocalDateTime,
            val someString: String
    )
    

    如果你只想为一堂课做这件事。 否则,您也可以在全球范围内这样做。

    public class Application {
    
        public static void main(String[] args) {
            Micronaut.run(Application.class);
        }
    
        @Singleton
        static class ObjectMapperBeanEventListener implements BeanCreatedEventListener<ObjectMapper> {
    
            @Override
            public ObjectMapper onCreated(BeanCreatedEvent<ObjectMapper> event) {
                final ObjectMapper mapper = event.getBean();
                mapper.registerModule(new JavaTimeModule());
                mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
                mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
                return mapper;
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复,我认为@Body 不是必需的,因为在另一个Controller 上它可以在没有@Body 的情况下工作,如果我将LocalDateTime 类型更改为String,它也可以在没有@Body 的情况下工作。但是,现在我收到此错误:无法为值 [null] 转换参数 [someDTO],原因是:无法从字符串 \"2020-09-14 10:30:00\" 反序列化类型为 java.time.LocalDateTime 的值:无法反序列化 java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-09-14 10:30:00' 无法在索引 10\n 处解析 [Source: UNKNOWN;行:-1,列:-1]
    • 啊抱歉..不知道..那么你必须调整杰克逊;-)导致默认它期待另一种格式:请参阅stackoverflow.com/questions/53195071/…如何做到这一点和baeldung.com/jackson-serialize-dates
    • 所以请检查以下内容: 1. 拥有 Jackson JSR310 Lib:github.com/FasterXML/jackson-modules-java8 2. 使用 BeanCreatedEventListener 将 JavaTimeModule 添加到 jackson 3. 使用正确的时间戳格式或指定您自己的
    • 好的,我终于明白了,这就是我所做的:我删除(意外)@Introspective 注释并添加了@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM- dd HH:mm:ss") 对类变量的注释,然后它就起作用了。你想编辑你的答案,所以我可以检查它绿色? ;)
    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    相关资源
    最近更新 更多