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

时间:2015-05-26 13:57:08

标签: jackson dropwizard jersey-client

我使用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应用程序类中使用:

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

'service'是我的休息类,调用'sendReport'方法。

问题

当我从浏览器或使用curl等调用服务器的其余服务时,它可以像预期的那样完美地运行以下消息体:

{“t”:“服务器的一些文字”}

但是当我运行我的应用程序来调用其余服务时,我得到一个400“无法处理JSON”。 调试和日志消息向我显示应用程序将以下JSON发送到我的服务器:

{“text”:“服务器的一些文字”}

导致杰克逊无法找到属性“文本”的错误。

为什么JerseyClient会忽略JsonProperty注释?

1 个答案:

答案 0 :(得分:1)

根据我的理解你使用了来自jersey的Entity.entity,它不知道@JsonProperty注释(来自jackson库)。你需要做的是使用jackson库进行序列化并将其发布给调用。