【问题标题】:Using Jackson as Jersey client serializer使用 Jackson 作为 Jersey 客户端序列化程序
【发布时间】:2011-01-30 02:20:54
【问题描述】:

在使用 Jersey 客户端 API 时,是否可以将 Jackson 用作 JSON 数据的序列化器/编组器而不是 JAXB?

如果可以怎么配置?

【问题讨论】:

  • 有趣的问题:我还没有使用过客户端 API。你在泽西名单上问过这个吗?绝对应该可以插入消息读取器/写入器,Jackson jax-rs 插件实现了这些接口。
  • StaxMan, Jersey 客户端 API 不是 JAX-RS 规范的一部分。但你说得对,我应该先尝试在泽西邮件列表上询问。
  • 对于最近的 Jersey 版本,如 2.26,请在下面查看我的回答。

标签: jersey jackson


【解决方案1】:

好的,我发现了,结果还是很简单的:

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client clientWithJacksonSerializer = Client.create(cc);

JacksonJsonProvider 来自 jackson-jaxrs 包。

【讨论】:

  • 另请参阅下面的 swist 答案,它更简单。
  • 它现在是 jackson-jaxrs-json-provider 包,带有更新版本的 jackson。
  • 有没有办法“自动发现”jacksonjson 提供者?
  • 救了我的命 :) .
【解决方案2】:

您可能还想试试org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1)

【讨论】:

  • @landon9720 因为它支持 JAXB 注释以及默认的 Jackson 注释。
【解决方案3】:

您可以跳过外部配置的创建并直接注册提供程序:

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)

【讨论】:

  • 寻找解决方案的时间比我承认的要长得多,这很有效!
  • 完美地为我工作,非常感谢。
【解决方案4】:

对于 jersey 2.22.2 和 Jackson 2.7.2 gradle 依赖项是:

dependencies {
    compile("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.7.2")
    compile("org.glassfish.jersey.core:jersey-client:2.22.2")
}

示例客户端代码是:

final String    name    = "world";
final Client    client  = ClientBuilder.newClient().register(JacksonJaxbJsonProvider.class);
final WebTarget target  = client.target("http://localhost:8080").path("hello").path(name);
final Message   message = target.request().get(Message.class);

System.out.println(message.getWelcomeMessage()); // hello world

【讨论】:

    【解决方案5】:

    我遇到了类似的问题,但对我来说,这里给出的建议都不起作用。 对我有用的是下面的代码:

    import javax.ws.rs.client.ClientBuilder;
    import javax.ws.rs.client.Client;
    ...
    
    ClientBuilder clientBuilder = ClientBuilder.newBuilder()
    clientBuilder.register(JacksonFeature.class);
    ...
    Client client = clientBuilder.build();
    

    关键的变化是JacksonFeature.class的用法——它来自jersey-media-json-jackson-x.yy.jar

    我从这篇文章中得到了使用这个解决方案的线索 - http://www.baeldung.com/jersey-jax-rs-client

    【讨论】:

      【解决方案6】:

      JacksonJaxbJsonProvider 的解决方案

      在 Jersey 客户端中使用 Jackson 和自定义配置的常用方法是使用 JacksonJaxbJsonProvider,例如这样

      JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
      provider.setMapper(yourObjectMapper());
      Client client = ClientBuilder.newClient(new ClientConfig(provider));
      

      不幸的是,他们在 Jersey 2.26 中复制了 JacksonJaxbJsonProvider 类 来自com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider神器(杰克逊) 到org.glassfish.jersey.media:jersey-media-json-jackson神器(球衣) 并更改了包装 来自com.fasterxml.jackson.jaxrs.jsonorg.glassfish.jersey.jackson.internal.jackson.jaxrs.json

      这种方式还是可以用的,只需要改JacksonJaxbJsonProviderimport即可。

      除了JacksonJaxbJsonProvider 现在在internal 包中的缺点也是 你必须知道你的代码在哪个 Jersey 版本上运行,当不同的依赖项需要不同的 Jersey 版本时,这可能是一个问题。

      ContextResolver<ObjectMapper> 的更好解决方案

      如何在 Jersey client 中配置 Jackson 的更好方法是使用在 Jersey server 中配置 Jackson 的相同方式,即创建 ObjectMapper 提供程序,如下所示:

      @Provider
      @Produces(MediaType.APPLICATION_JSON)
      public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
      
          private ObjectMapper objectMapper = yourObjectMapper();
      
          @Override
          public ObjectMapper getContext(Class<?> objectType) {
              return objectMapper;
          }
      
      }
      

      并像这样使用它:

      ClientConfig clientConfig = new ClientConfig();
      clientConfig.register(JacksonFeature.class);  // usually auto-discovered
      clientConfig.register(new ObjectMapperProvider());
      Client client = ClientBuilder.newClient(clientConfig);
      

      如果您同时拥有服务器和客户端,则可以重用 ObjectMapperProvider 类。

      似乎这种方法适用于 Jersey 2.9 版。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 2011-07-30
        相关资源
        最近更新 更多