gpt4 book ai didi

java - 自定义对象在 Jax-RS 中反序列化很好,但如果它在另一个对象中使用,则它不起作用

转载 作者:行者123 更新时间:2023-11-30 11:06:25 25 4
gpt4 key购买 nike

如果我只是传递我的自定义对象,反序列化工作正常

@POST
public Response saveCustomObject(CustomObject data)
{
// Prints correct value
System.out.println(data);
}

但是,如果它是另一个对象的属性,它只是获取我的自定义对象的默认值

@POST
public Response saveCustomObjectWrapper(CustomObjectWrapper data)
{
// Prints incorrect value
System.out.println(data.getCustomObject());
}

我的提供商已注册,如下所示:

public CustomObject readFrom(Class<CustomObject> type, Type type1, Annotation[] antns, MediaType mt, MultivaluedMap<String, String> mm, InputStream in) throws IOException, WebApplicationException
{
try {
return new CustomObject(IOUtils.toString(in));
} catch (Exception ex) {
throw new ProcessingException("Error deserializing a CustomObject.", ex);
}
}

最佳答案

问题是所有其他对象的读取器在解码时不进行查找/委托(delegate)。我的意思,可以在this answer中看到,其中一个读者根据类型查找另一个读者。假设格式是 JSON,无论您使用的是 MOXy(Glassfish 的默认格式)还是 Jackson,结果都是一样的。阅读器足够聪明,可以自己处理 JSON,因此不需要查找任何其他阅读器。

一个解决方案是为包装类创建另一个读取器,并执行查找/委托(delegate),如上面的链接所示。如果你有很多这样的情况,你可以扩展默认阅读器,并覆盖它的解码方法,但我完全不建议这样做,除非你真的知道你在做什么。

另一种解决方案是编写 JsonDeserializer(针对 Jackson)或 XmlAdapter(针对 MOXy 或 Jackson),这取决于您使用的序列化程序。对于 jackson 来说,一个例子是这样的(你可以看到一个更好的例子 here )

public class CustomObjectDeserializer extends JsonDeserializer<CustomObject> { 

@Override
public CustomObject deserialize(JsonParser jp, DeserializationContext dc)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
return new CustomObject("Hello World");
}
}

@JsonDeserialize(using = CustomObjectDeserializer.class)
public class CustomObject {
public String message;
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public CustomObject(String message) { this.message = message; }
public CustomObject(){}
}

在这种情况下,根本不需要自定义阅读器。这将处理 CustomObject 和以 CustomObject 作为成员的对象。一个问题是我不确定如何或是否可以获取 InputStream。您只需要使用 Jackson API 来解析 JSON。

如果你想使用 Jackson 而不是 glassfish 的默认 MOXy,你可以只添加 Jackson 依赖项

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.13</version>
</dependency>

然后注册JacksonFeature,或者简单地禁用MOXy,如前所述here .如果你想继续使用 MOXy,我不知道是否有类级适配器这样的东西,所以你仍然需要阅读器以及为类成员创建一个 XmlAdapter。这有点麻烦,但这就是我推荐 Jackson 的原因,除了这个特定用例之外还有很多其他原因。您可以查看适配器的示例 here

现在很多答案都是基于您使用 JSON 格式的假设,因为您没有指定您正在使用的媒体类型。如果是其他格式,那么我认为您唯一的解决方案可能是为包装器创建另一个客户阅读器。

关于java - 自定义对象在 Jax-RS 中反序列化很好,但如果它在另一个对象中使用,则它不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29321901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com