我有一个春季启动项目,我有一个这样的课程:
@Value
public class A {
@JsonUnwrapped
OrderKey key;
String description;
B b;
@Value
public static class B {
String description;
}
}
@Value
public class OrderKey {
@JsonProperty( "_key" )
String id;
}
我有mixins,但为了简洁起见,在此示例中添加了Annotations。
序列化为JSON时,这很有用,问题是当我尝试反序列化时,如果存在一些@JsonWrapped
注释,它可能会起作用。
简而言之,我正在尝试使用ArangoDB进行休息,我可以创建/读取文档,但我需要使用自己的Value Objects,不幸的是我不能将密钥用作String,它由{{{ 1}}。
OrderKey
注释来自lombok项目。
有没有办法实现这个目标?
答案 0 :(得分:0)
您可以尝试在class A
中使用@JsonCreator
注释来定义构造函数。然后,Jackson可以使用此构造函数创建A
对象,并将您希望在JSON文档中的字段映射到A
的字段。简化示例:
@Value
public class A {
@JsonUnwrapped
OrderKey key;
String description;
@JsonCreator
public A(@JsonProperty("key") String key,
@JsonProperty("description") String description) {
this.key = new OrderKey(key);
this.description = description;
}
}
请注意,A
的此构造函数将阻止@AllArgsConstructor
暗示的@Value
构造函数的创建。
还可以避免使用Java 8和一些额外模块的构造函数注释。检查我的this其他答案。
答案 1 :(得分:0)
我最终在mixin内部进行了序列化/反序列化,这样我可以避免@JsonUnwrapped
注释和Key的另一个mixin。
密新:
public class OrderMixin {
@JsonDeserialize( using = OrderKeyDeserializer.class )
@JsonSerialize( using = OrderKeySerializer.class )
@JsonProperty( "_key" )
OrderKey key;
@JsonProperty( "description" )
String description;
@JsonProperty( "amount" )
String amount;
@JsonProperty( "operation" )
Order.Operation operation;
@JsonProperty( "creationDate" )
LocalDateTime creationDate;
public static class OrderKeySerializer extends JsonSerializer<OrderKey> {
public OrderKeySerializer() {
super( OrderKey.class );
}
@Override
public void serialize( OrderKey value, JsonGenerator gen, SerializerProvider provider ) throws IOException {
gen.writeString( value.getOrderId() );
}
}
public static class OrderKeyDeserializer extends JsonDeserializer<OrderKey> {
public OrderKeyDeserializer() {
super( OrderKey.class );
}
@Override
public OrderKey deserialize( JsonParser jsonParser, DeserializationContext context ) throws IOException {
JsonNode node = jsonParser.getCodec().readTree( jsonParser );
return OrderKey.get( node.asText() );
}
}
}
价值对象:
@Value
public class Order implements Serializable {
private static final long serialVersionUID = 901109456762331944L;
OrderKey key;
String description;
String amount;
Operation operation;
LocalDateTime creationDate;
@Value
public static class Operation {
String id;
String description;
String status;
LocalDateTime creationDate;
}
}
@Value
public class OrderKey implements Serializable {
private static final long serialVersionUID = -8102116676316181864L;
private String orderId;
public static OrderKey get( String orderId ) {
return new OrderKey( orderId );
}
}