Jersey 使用Dropwizard的自定义序列化程序/反序列化程序的选项?
有什么好方法可以让自定义(反)序列化程序可以在dropwizard外部注册 我在(反)序列化复合对象时遇到问题。我尝试使用Jersey 使用Dropwizard的自定义序列化程序/反序列化程序的选项?,jersey,jackson,dropwizard,jersey-client,Jersey,Jackson,Dropwizard,Jersey Client,有什么好方法可以让自定义(反)序列化程序可以在dropwizard外部注册 我在(反)序列化复合对象时遇到问题。我尝试使用@JsonUnwrapped获取我想要的JSON,但在反序列化时遇到了问题-它需要特殊的构造函数来获取字符串,并且要求复合对象具有构造封装对象的知识。此外,我还希望在我的值对象上不必使用Jackson注释 例如,我有: public class SubmissionModule extends SimpleModule { public SubmissionModul
@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();
}
}
}
公共类SubmissionModule扩展了SimpleModule{
公共提交模块(){
addDeserializer(SubmissionDetails.class,新SubmissionDeserializer());
addSerializer(SubmissionDetails.class,新SubmissionSerializer());
}
公共类SubmissionSerializer扩展JsonSerializer{
@凌驾
public void serialize(SubmissionDetails值、JsonGenerator jgen、SerializerProvider提供程序)引发IOException、JsonProcessingException{
jgen.writeStartObject();
jgen.writeStringField(“id”,“value.getId());
writeStringField(“title”,value.getTitle());
writeStringField(“abstract”,value.getAbstract());
jgen.writeEndObject();
}
}
公共类SubmissionDeserializer扩展JsonDeserializer{
@凌驾
public SubmissionDetails反序列化(最终JsonParser jp,最终反序列化上下文ctxt)引发IOException,JsonProcessingException{
JsonNode节点=jp.getCodec().readTree(jp);
返回AsSubmissionWithId(SubmissionId.from(node.get(“id”).asText())
.title(node.get(“title”).asText())
.abstract_(node.get(“abstract”).asText()).create();
}
}
}
我已在DropWizard中注册,如下所示:
bootstrap.getObjectMapper().registerModule(新SubmissionModule())代码>
但我无法确定是否可以向Jersey客户端(或使用ResourceTestRule
时可用的客户端)注册(反)序列化程序
有什么想法吗?我不知道您从哪里获得有关@JsonUnwrapped
的信息,但它不需要特殊的构造函数或包含和封装对象之间的依赖关系。否则,它不会真正增加太多的用途。
注释只是指示引用的对象应作为属性序列(在父对象中)写入,而不是作为对象值写入。
并不是说它必然适用于您的用例,但您可能已经看到了糟糕的示例代码或其他东西
至于避免在值对象中添加注释:一种方法是使用“混合注释”()。
这样,您就可以使用@JsonSerialize(using=MySerializer.class)
和@JsonDeserialize(using=MyDeserializer.class)
来指示要使用的处理程序
注册自定义(反)序列化程序是通过实现模块
(通常只是构造或子类SimpleModule
),并使用DropWizard使用的ObjectMapper
注册来处理的
“但我无法确定是否可以向Jersey客户端(或使用ResourceTestRule时可用的客户端)注册(反)序列化程序。”
看看这本书。有一个方法setMapper(ObjectMapper)
你可以这样做
ObjectMapper mapper = Jackson.newObjectMapper();
mapper.registerModule(new SubmissionModule());
@ClassRule
public static final ResourceTestRule RULE
= new ResourceTestRule.Builder().setMapper(mapper).addResource(...).build();
使用@JsonUnwrapped
,通过设置前缀解决了我遇到的问题(“未分配任何值反序列化程序”
异常)@JsonUnwrapped(prefix=“submission.”)
。