我使用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注释?
答案 0 :(得分:1)
根据我的理解你使用了来自jersey的Entity.entity,它不知道@JsonProperty注释(来自jackson库)。你需要做的是使用jackson库进行序列化并将其发布给调用。