【问题标题】:Options for custom serializers / deserializers with Dropwizard?带有 Dropwizard 的自定义序列化器/反序列化器的选项?
【发布时间】:2015-02-26 19:33:47
【问题描述】:

拥有可以在 dropwizard 外部注册的自定义(反)序列化程序的好方法是什么?

我在(反)序列化复合对象时遇到问题。我尝试使用@JsonUnwrapped 来获取我想要的 JSON,但是在反序列化时遇到了问题 - 它需要特殊的构造函数来获取字符串,并且需要复合对象了解构造封装对象的知识。另外,我想要一种不必在我的值对象上使用 Jackson 注释的方法。

例如,我有:

public class SubmissionModule extends SimpleModule {
    public SubmissionModule() {
        addDeserializer(SubmissionDetails.class, new SubmissionDeserializer());
        addSerializer(SubmissionDetails.class, new SubmissionSerializer());
    }

    public class SubmissionSerializer extends JsonSerializer<SubmissionDetails> {
        @Override
        public void serialize(SubmissionDetails value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
            jgen.writeStartObject();
            jgen.writeStringField("id", "" + value.getId());
            jgen.writeStringField("title", value.getTitle());
            jgen.writeStringField("abstract", value.getAbstract());
            jgen.writeEndObject();
        }
    }

    public class SubmissionDeserializer extends JsonDeserializer<SubmissionDetails> {
        @Override
        public SubmissionDetails deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException, JsonProcessingException {
            JsonNode node = jp.getCodec().readTree(jp);
            return aSubmissionWithId(SubmissionId.from(node.get("id").asText()))
                    .title(node.get("title").asText())
                    .abstract_(node.get("abstract").asText()).create();
        }
    }
}

我在 DropWizard 中注册的内容如下: bootstrap.getObjectMapper().registerModule(new SubmissionModule());

但我不知道是否可以向 Jersey 客户端(或使用 ResourceTestRule 时可用的客户端)注册(反)序列化程序。

有什么想法吗?

【问题讨论】:

    标签: jersey jackson dropwizard jersey-client


    【解决方案1】:

    “但我不知道是否可以向 Jersey 客户端(或使用 ResourceTestRule 时可用的客户端)注册(反)序列化程序。”

    查看source code for ResourceTestRule。有一个方法setMapper(ObjectMapper)

    你可以这样做

    ObjectMapper mapper = Jackson.newObjectMapper();
    mapper.registerModule(new SubmissionModule());
    @ClassRule
    public static final ResourceTestRule RULE 
               = new ResourceTestRule.Builder().setMapper(mapper).addResource(...).build();
    

    【讨论】:

      【解决方案2】:

      我不知道您从哪里获得有关@JsonUnwrapped 的信息,但它不需要特殊的构造函数或包含对象和封装对象之间的依赖关系。否则它不会真正增加很多用途。 注释只是表明所引用的 Object 应该写为属性序列(在父对象中),而不是 Object 值。 并不是说它一定适用于您的用例,但您可能已经看到了错误的示例代码或其他东西。

      关于避免值对象中的注释:一种方法是使用“混合注释”(http://www.studytrails.com/java/json/java-jackson-mix-in-annotation.jsp)。 这样,您可以使用@JsonSerialize(using=MySerializer.class) 和@JsonDeserialize(using=MyDeserializer.class) 来指示要使用的处理程序。

      通过实现Module(通常只是构造或子类SimpleModule)并使用DropWizard 使用的ObjectMapper 注册来处理注册自定义(反)序列化程序。

      【讨论】:

      • 使用@JsonUnwrapped,我遇到的问题("No _valueDeserializer assigned" 异常)通过设置前缀得到解决。 @JsonUnwrapped(prefix="submission.").
      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多