Dropwizard / JerseyClient 在发送 http 请求时忽略了 JsonProperty

Dropwizard / JerseyClient ignored JsonProperty when sending http request

我有两个使用 Dropwizard-0.8 实现的 REST 服务。 两者都与以下 POJO 共享 API 依赖项:

public class Report{
  private String text;
  @JsonProperty("t")
  public String getText() 
  {
    return text;
  }

  public void setText(String tx)
  {
    text = tx;
   }
}

我的服务器有休息资源:

@POST
@Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
@Produces(MediaType.TEXT_PLAIN + ";charset=UTF-8")
@Timed
public Response receive(Report dto) {
  //do some stuff with dto
}

我的客户有一个方法:

sendReport(report);

与:

private void sendReport(Report report) {
    final String uri = "http://localhost:8080/.....";
    Response response = null;
    try {
        response = client.target(uri).request().post(Entity.entity(report, MediaType.APPLICATION_JSON), Response.class);

        final int status = response.getStatus();
        if (status != Status.ACCEPTED.getStatusCode()) {
            final StatusType statusInfo = response.getStatusInfo();
            throw new SomeException();
        }

    }
    catch (Exception e) {
        LOGGER.error(e.getMessage());
    }
    finally {
        if (response != null) {
            response.close();
        }
    }
}

客户端是在 Dropwizard 应用程序 class 中创建的:

    service.client = new JerseyClientBuilder(env).using(conf.getJerseyClient()).withProvider(JacksonJaxbJsonProvider.class).build(getName());
    env.jersey().register(service);

其中 'service' 是我休息 class 调用 'sendReport' 方法。

问题

当我从浏览器或使用 curl 等调用我的服务器的其余服务时,它与以下消息正文一起按预期完美运行:

{"t":"some text for the server"}

但是当我 运行 我的应用程序调用其余服务时,我得到了 400 "unable to process JSON"。 调试和日志消息显示应用程序向我的服务器发送了以下 JSON:

{"text":"some text for the server"}

这导致杰克逊找不到 属性 "text" 的错误。

为什么 JerseyClient 会忽略 JsonProperty 注释?

据我了解,您使用的是来自 jersey 的 Entity.entity,它不知道 @JsonProperty 注释(来自 jackson 库)。您需要做的是使用 jackson 库进行序列化并将其提供给 post call 。