使用 Dropwizard 的自定义序列化器/反序列化器的选项?

Options for custom serializers / deserializers with Dropwizard?

有什么好方法可以使用 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 时可用的客户端)注册(反)序列化器。

有什么想法吗?

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

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

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

"but I can't figure out if it's possible to register the (de)serializers with the Jersey Client (or the client available when using 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();