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

Jersey 使用Dropwizard的自定义序列化程序/反序列化程序的选项?,jersey,jackson,dropwizard,jersey-client,Jersey,Jackson,Dropwizard,Jersey Client,有什么好方法可以让自定义(反)序列化程序可以在dropwizard外部注册 我在(反)序列化复合对象时遇到问题。我尝试使用@JsonUnwrapped获取我想要的JSON,但在反序列化时遇到了问题-它需要特殊的构造函数来获取字符串,并且要求复合对象具有构造封装对象的知识。此外,我还希望在我的值对象上不必使用Jackson注释 例如,我有: public class SubmissionModule extends SimpleModule { public SubmissionModul

有什么好方法可以让自定义(反)序列化程序可以在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();
        }
    }
}
公共类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.”)