提问人: 提问时间:2/26/2023 最后编辑:Anonymous 更新时间:2/26/2023 访问量:872
现在在 MapStruct 中设置日期时间字段?
Set datetime field now in MapStruct?
问:
我的 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] 处解析,根本原因”
如何解决这个问题?
答:
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 字段
评论