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 。
我有两个使用 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 。