现在在 MapStruct 中设置日期时间字段?

Set datetime field now in MapStruct?

提问人: 提问时间:2/26/2023 最后编辑:Anonymous 更新时间:2/26/2023 访问量:872

问:

我的 POJO 类中有一个 Instant 字段,并希望在创建记录时设置其值。据我所知,MapStruct 允许这种功能,但我无法正确设置它:now()

映射:

@Mapper(componentModel = "spring", imports = {Instant.class})
public interface CreatePostRequestMapper {

    // @Mapping(target = "createdAt", defaultExpression ="java(Instant.now())")
    @Mapping(target = "createdAt", defaultValue = "java(Instant.now())")
    Post toEntity(CreatePostRequest source);

    CreatePostRequest toDto(Post destination);
}

并且这两个类具有相同的属性和相同的名称:

private Instant createdAt;

以下是服务方法:

private final CreatePostRequestMapper createPostRequestMapper;

public PostDetails createPost(@Valid CreatePostRequest request) {
    final Post post = createPostRequestMapper.toEntity(request);

    // code omitted
}

这将产生以下错误:

“请求处理失败;嵌套异常是 java.time.format.DateTimeParseException:文本“java(Instant.now())”无法在索引 0] 处解析,根本原因”

如何解决这个问题?

java spring spring-boot mapstruct java.time.instant

评论


答:

0赞 Max Aminov 2/26/2023 #1

当您将 defaultValue 用于 Instant 类时,它将生成以下代码:

post.setCreatedAt( Instant.parse( "java(Instant.now())" ) );

而且,显然,Instant 类无法解析此字符串并创建对象。

所以,正确的方法是使用 defaultExpression,这将生成以下代码:

post.setCreatedAt( Instant.now() );

差异是显而易见的:)

希望对你有帮助。

评论

0赞 2/26/2023
非常好。另一方面,您有在全球范围内设置 Instant 的想法吗?这适用于 DateTime,但不能为 Instant 实现它。任何想法 -->
0赞 2/26/2023
@Configuration public class AppConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { return builder -> { builder.simpleDateFormat(DATE_TIME_FORMAT); builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); // not working >>> builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT).withZone(ZoneId.systemDefault()))); }; } }
0赞 Max Aminov 2/26/2023
您的意思是,如何设置配置以正确的DATE_TIME_FORMAT字符串格式序列化 Instant 字段?
0赞 2/26/2023
在我的 Spring Boot 项目中,我可以使用该全局配置格式化 LocalDate 和 LocalDateTime。我还想在 DATE_TIME_FORMAT 格式化我的 Instant 字段,但找不到合适的参数(序列化程序方法采用不同的参数):
0赞 Max Aminov 2/26/2023
在库中查找,我不知道为什么,但是类 InstantSerializer 只有受保护的构造函数。目前,我只能建议您手动将@JsonSerialize注释添加到每个 Instant 字段