我有以下Enum和一个LocalDateTime。
public enum OrderStatus {
CREATED,
IN_PROGRESS,
INVALID,
PAID,
CONFIRMED;
private LocalDateTime timestamp;
OrderStatus() {
this.timestamp = LocalDateTime.now();
}
public LocalDateTime getTimestamp() {
return this.timestamp;
}
public OrderStatus setTimestamp(LocalDateTime timestamp) {
this.timestamp = timestamp;
return this;
}
}
我创建了下面的编解码器,但它没有被自动注册。
@Singleton
public class OrderStatusCodec implements Codec<OrderStatus> {
@Override
public OrderStatus decode(BsonReader bsonReader, DecoderContext decoderContext) {
System.out.println("Decoding...");
return OrderStatus.valueOf(bsonReader.readString())
.setTimestamp(LocalDateTime.ofInstant(
new Date(bsonReader.readDateTime()).toInstant(),
ZoneId.of("UTC")));
}
@Override
public void encode(BsonWriter bsonWriter, OrderStatus status, EncoderContext encoderContext) {
System.out.println("Encoding....");
bsonWriter.writeDateTime(Date.from(status.getTimestamp().toInstant(ZoneOffset.UTC)).getTime());
bsonWriter.writeString(status.name());
}
@Override
public Class<OrderStatus> getEncoderClass() {
return OrderStatus.class;
}
}
当我发布我的订单实体时,我没有看到解码器被调用。当我检索订单时,我也没有看到Json格式的时间戳。
是否也可以将时间戳格式化为序列化?我可以在私有字段的枚举中使用@JsonbDateFormat("yyyy-MM-dd'T'hh:mm:ss")吗?
使用:
为了让MongoDB使用你的Codec,你必须同时提供一个Codec和一个CodecProvider。更多的细节请看这个文档部分。https:/quarkus.ioguidesmongodb#simplifying-mongodb-client-usage-using-bson-codec。
对你来说,这意味着这样的事情。
public class OrderStatusCodecProvider implements CodecProvider {
@Override
public <T> Codec<T> get(Class<T> clazz, CodecRegistry registry) {
if (clazz == OrderStatus.class) {
return (Codec<T>) new OrderStatusCodec();
}
return null;
}
}