如何在 micronaut 中启用 Jackson 自定义序列化程序?

问题描述 投票:0回答:1

我有一个用例可以为其中一个字段启用自定义序列化。我正在尝试使用下面的代码片段来实现相同的功能。

@JsonSerialize(using = CustomSerializer.class)
private CustomDTO customDto;

错误说:

java: Annotation @JsonSerialize specifies attribute 'contentUsing'. Currently supported attributes include: [as]

还有其他替代方法在 micronaut 中引入自定义序列化吗?

具体场景: 需要在cosmos db read中引入自定义序列化器/反序列化器。 Azure Cosmos 使用 Jackson 来实现同样的目的。这里需要引入自定义序列化器。但似乎 micronaut 不支持

using
属性? ()

@JsonSerialize(using = CustomSerializer.class)
private CustomDTO customDto;
serialization deserialization azure-cosmosdb micronaut jackson-databind
1个回答
0
投票

我假设您使用的是 Micronaut Serde,它没有实现 Jackson 提供的所有功能。您可以实施global customerDTO Serde。

@Singleton
public class CustomerDTOSerde implements Serde<CustomerDTO> {

  @Override
  public @Nullable CustomerDTO deserialize(
      @NonNull Decoder outerDecoder,
      @NonNull DecoderContext context,
      @NonNull Argument<? super CustomerDTO> type)
      throws IOException {

    try (Decoder innerDecoder = outerDecoder.decodeObject(type)) {

      String key = innerDecoder.decodeKey();
      String fieldA = null

      while (key != null) {

        if (Objects.equals("fieldA2, key)) {
          fieldA = innerDecoder.decodeString();
        } else {
          throw new IllegalArgumentException("Unknown key " + key);
        }
        key = innerDecoder.decodeKey();
      }
    }

    return new CustomerDTO(fieldA);
  }

  @Override
  public void serialize(
      @NonNull Encoder encoder,
      @NonNull EncoderContext context,
      @NonNull Argument<? extends CustomerDTO> type,
      @NonNull CustomerDTO value)
      throws IOException {
    try (Encoder objectEncoder = encoder.encodeObject(type)) {
      objectEncoder.encodeKey("fieldA");
      objectEncoder.encodeString(value.getFieldA());
      //..
    }
  }
}

上面的示例假设您有一个

CustomerDTO
,其中包含单个属性
fieldA

© www.soinside.com 2019 - 2024. All rights reserved.