使用 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();
有什么好方法可以使用 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();