【问题标题】:Issue marshalling generic with Moxy and JerseyClient2使用 Moxy 和 JerseyClient2 发出编组泛型
【发布时间】:2016-08-16 06:34:51
【问题描述】:

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

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

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() {}
}

Service.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"}"}

【问题讨论】:

    标签: java generics jersey-2.0 moxy jersey-client


    【解决方案1】:

    由于类型擦除,泛型类型在运行时被清除,所以 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 了。我有太多的问题。就个人而言,我建议切换到杰克逊。有了杰克逊,您将不会遇到这种类型的问题。您可以使用GenericEntity 摆脱not,它会解决问题。如果您使用的是 Maven,只需添加以下依赖项并删除 MOXy

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

    如果您不使用 Maven,请查看 this post

    【讨论】:

    • 谢谢,我玩过 GenericEntity 但这很完美。
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多