gpt4 book ai didi

java - 使用 Moxy 和 JerseyClient2 发出通用编码问题

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

以下代码使用具有内置 Moxy JSON 支持的 Jersey2 客户端(v 2.22.2)。我正在尝试将通用包装类编码为 JSON。正如您在下面看到的,json 属性未按预期解码。

当我将 json 属性的类型更改为 Service 并“ungenerify”时,该类一切都按预期工作,但我更希望能够使用泛型来做到这一点所以我不必为需要以这种方式包装的每种类型创建一堆这些包装器类。

JSONWrapper.java

public class JSONWrapper<T> implements Serializable {
private T json;

public T getJson() { return this.json; }
public void setJson (T payload) { this.json = payload; }

public JSONWrapper() {}
}

服务.java

public class Service implements Serializable {
private String name;
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

MyClient.java

public class MyClient {
private Client jerseyClient;

public void createService(Service item) {
Invocation.Builder invocationBuilder = buildRequest(SERVICE_PATH);
JSONWrapper<Service> wrapper = new JSONWrapper<>();
wrapper.setJson(item);
final Response response = invocationBuilder.post(Entity.entity(wrapper, MediaType.APPLICATION_JSON_TYPE));
}

public MyClient() {
this.jerseryClient = ClientBuilder.newBuilder().build();
}

public static void main(String[] args) {
MyClient myClient = new MyClient();
Service myService = new Service();
myService.setName("foo");
myClient.createService(myService);
}
}

打开日志过滤器后,我看到 Moxy 对事物的编码如下所示:

{"json":"com.baz.Service@5674e1f2"}

当我希望它看起来像这样

{"json":"{"name": "foo"}"}

最佳答案

由于类型删除,泛型类型在运行时被删除,因此 MOXy 不知道泛型类型,只是吐出其 toString。这是使用 MOXy 的限制之一(它依赖于一些 JAXB 功能)。为了解决这个问题,JAX-RS 有 GenericEntity让我们包装泛型类型,以便序列化器知道它。

JsonWrapper<Service> service = new JsonWrapper<>();
user.setJson(new Service("blah"));
GenericEntity<JsonWrapper<Service>> entity
= new GenericEntity<JsonWrapper<Service>>(service){};
Response response = target("test").request().post(Entity.json(entity));

根据我刚刚使用 MOXy 进行的测试,由于某种原因,它在 JSON 中输出了一个额外的 "type":"service" 属性。我不完全确定为什么。我已经有一段时间没有使用 MOXy 了。我遇到了太多的问题。就我个人而言,我建议改用 jackson 。有了 jackson ,你就不会遇到这种类型的问题。您可以使用GenericEntity,并且它会正常工作。如果您使用 Maven,只需添加以下依赖项并删除 MOXy

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey2.version}</version>
</dependency>

如果您没有使用 Maven,请查看 this post .

关于java - 使用 Moxy 和 JerseyClient2 发出通用编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36797036/

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