java 客户端消费 API
java client consuming API
我正在尝试使用邮件枪 API 来获取退回邮件数据。
public static ClientResponse GetBounce() {
Client client = new Client();
client.addFilter(new HTTPBasicAuthFilter("api",
"key-XXXXXXXXXXXXXXXXXXXXX"));
WebResource webResource =
client.resource("https://api.mailgun.net/v3/XXXXXXXXXXXX.mailgun.org/" +
"bounces/foo@bar.com");
return webResource.get(ClientResponse.class);}
工作正常 API 调用正常,但我无法在我的 cae EmailError 中将 ClientResponse 转换为适当的类型。
服务器的实际响应是 {"address":"a@gmail.com","code":"550","error":"550 5.2.1 The email account that you tried to reach is disabled. lq5si9613879igb.63 - gsmtp","created_at":"Tue, 18 Aug 2015 12:23:35 UTC"}
我创建了 POJO 来映射响应
@JsonAutoDetect(getterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY)
@JsonSerialize(include = Inclusion.NON_NULL)
public class EmailError {
private String address;
private String error;
private String created_at;
//geters...
//setters..
}
并尝试将 ClientResponse 映射到 EmailError 类型。
ClientResponse clientResponse = getBounce(email);
EmailError error = response.getEntity(new GenericType<EmailError>() {
});
其中 clientResponse 是对象 return 通过方法 GetBounce()
It throws an Exception com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class com.che.rt.businessservices.EmailError, and Java type class com.che.rt.businessservices.EmailError, and MIME media type application/json;charset=utf-8 was not found
猜猜我哪里漏了。
您似乎有 Jackson 依赖项(因为您正在使用它的注释)但这对于 Jersey 来说还不够。 Jersey 使用 MessageBodyReader
s 反序列化 request/response 主体。所以你需要一个可以处理 JSON 的。 Jackson 确实实现了 JAX-RS reader 和编写器。因此,您需要的依赖项是 Jackson 提供者,而不仅仅是主要的 Jackson 库。
对于 Jersey,您可以添加此依赖项
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.19</version>
</dependency>
这将引入 Jackson 1.9.2,这样您就可以摆脱您拥有的其他 Jackson 依赖项,以免版本冲突。然后,您需要向 Jersey 客户端注册 Jackson 提供程序。为此你可以做
ClientConfig config = new DefaultClientConfig();
config.getProperties().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
config.getSingletons().add(new JacksonJsonProvider());
Client client = Client.create(config);
注意上面使用的是 Jackson 1.9.2。如果你想使用更新的 2.x Jackson,那么使用这个
而不是上面的依赖
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<!-- or whatever [2.2,) version you want to use -->
<version>2.5.0</version>
</dependency>
那么配置应该也不一样
ClientConfig config = new DefaultClientConfig();
config.getSingletons().add(new JacksonJsonProvider());
Client client = Client.create(config);
我正在尝试使用邮件枪 API 来获取退回邮件数据。
public static ClientResponse GetBounce() {
Client client = new Client();
client.addFilter(new HTTPBasicAuthFilter("api",
"key-XXXXXXXXXXXXXXXXXXXXX"));
WebResource webResource =
client.resource("https://api.mailgun.net/v3/XXXXXXXXXXXX.mailgun.org/" +
"bounces/foo@bar.com");
return webResource.get(ClientResponse.class);}
工作正常 API 调用正常,但我无法在我的 cae EmailError 中将 ClientResponse 转换为适当的类型。
服务器的实际响应是 {"address":"a@gmail.com","code":"550","error":"550 5.2.1 The email account that you tried to reach is disabled. lq5si9613879igb.63 - gsmtp","created_at":"Tue, 18 Aug 2015 12:23:35 UTC"}
我创建了 POJO 来映射响应
@JsonAutoDetect(getterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY)
@JsonSerialize(include = Inclusion.NON_NULL)
public class EmailError {
private String address;
private String error;
private String created_at;
//geters...
//setters..
}
并尝试将 ClientResponse 映射到 EmailError 类型。
ClientResponse clientResponse = getBounce(email);
EmailError error = response.getEntity(new GenericType<EmailError>() {
});
其中 clientResponse 是对象 return 通过方法 GetBounce()
It throws an Exception com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class com.che.rt.businessservices.EmailError, and Java type class com.che.rt.businessservices.EmailError, and MIME media type application/json;charset=utf-8 was not found
猜猜我哪里漏了。
您似乎有 Jackson 依赖项(因为您正在使用它的注释)但这对于 Jersey 来说还不够。 Jersey 使用 MessageBodyReader
s 反序列化 request/response 主体。所以你需要一个可以处理 JSON 的。 Jackson 确实实现了 JAX-RS reader 和编写器。因此,您需要的依赖项是 Jackson 提供者,而不仅仅是主要的 Jackson 库。
对于 Jersey,您可以添加此依赖项
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.19</version>
</dependency>
这将引入 Jackson 1.9.2,这样您就可以摆脱您拥有的其他 Jackson 依赖项,以免版本冲突。然后,您需要向 Jersey 客户端注册 Jackson 提供程序。为此你可以做
ClientConfig config = new DefaultClientConfig();
config.getProperties().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
config.getSingletons().add(new JacksonJsonProvider());
Client client = Client.create(config);
注意上面使用的是 Jackson 1.9.2。如果你想使用更新的 2.x Jackson,那么使用这个
而不是上面的依赖<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<!-- or whatever [2.2,) version you want to use -->
<version>2.5.0</version>
</dependency>
那么配置应该也不一样
ClientConfig config = new DefaultClientConfig();
config.getSingletons().add(new JacksonJsonProvider());
Client client = Client.create(config);