我尝试使用以下代码段从http://api.openweathermap.org/data/2.5/forecast/daily?lat=35&lon=139&cnt=10&mode=json接收json数据:
private WebTarget getWebTarget() {
Client client = JerseyClientBuilder.newClient();
return client.target("http://api.openweathermap.org/")
.path("data")
.path("2.5");
}
// new one method
Response response = getWebTarget()
.path("daily")
.queryParam("q", String.format("%s,%s", town, countryCode))
.queryParam("cnt", 10)
.queryParam("mode", "json")
.request().accept(MediaType.APPLICATION_JSON_TYPE).get();
WeatherForecast forecast = response.readEntity(WeatherForecast.class);
但最后一行抛出:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: 找不到媒体类型= application / octet-stream的MessageBodyReader, 类型=类 com.app.weather.providers.org.openweathermap.pojo.WeatherForecast, genericType =类 com.app.weather.providers.org.openweathermap.pojo.WeatherForecast。
pom.xml中的Jersey依赖项:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.4</version>
<!-- use the following artifactId if you don't need servlet 2.x compatibility -->
<!-- artifactId>jersey-container-servlet</artifactId -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json</artifactId>
<version>2.0-m05-1</version>
</dependency>
此代码在应用程序服务器之外运行。感谢。
答案 0 :(得分:3)
Jersey JSON支持是一组扩展模块,其中每个模块都包含需要注册到Feature
实例(客户端/服务器)的Configurable
实现。有多个框架为JSON处理和/或JSON到Java绑定提供支持。下面列出的模块通过将各个JSON框架集成到Jersey中来提供对JSON表示的支持。目前,Jersey集成了以下模块以提供JSON支持:
了解更多信息,请阅读泽西文档的chapter 9。
Moxy是json媒体支持的建议方法。 MOXy媒体模块是您不需要在客户端/服务器中明确注册它的功能(MoxyJsonFeature)的模块之一可配置,因为当您添加jersey-media-moxy时会自动发现并注册此功能模块到你的类路径。
要将MOXy用作JSON提供程序,您需要将jersey-media-moxy模块添加到pom.xml文件中:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.15</version>
</dependency>
如果您不使用Maven,请确保拥有所有必需的依赖项。见jersey-media-moxy dependencies。
您需要将这些jar文件添加到项目中,以便通过jersey-media-moxy支持json媒体类型:
public class MyJAXBBean{
private String name = "jack";
private int id = 12;
public MyJAXBBean() {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
}
运行球衣客户端示例的主要类:
public static void main(String[] args) {
//ClientConfig cc = new ClientConfig().register(new JacksonFeature());
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8084/myhost/test");
Form form = new Form();
form.param("x", "foo");
form.param("y", "bar");
MyJAXBBean bean;
bean = target.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE),
MyJAXBBean.class);
System.out.println(bean);
}
服务器(http://localhost:8084/myhost/test
)的json响应必须采用以下格式:
{"name":"haleh", "id":3}
答案 1 :(得分:2)
通过编写自定义MessageBodyReader来解决。 https://jersey.java.net/documentation/latest/message-body-workers.html#d0e4072
答案 2 :(得分:2)
我遇到了类似的问题,请尝试使用媒体类型“application / javascript”解组JSON。 我只想为原始答案做出贡献,举例说明我如何实施建议的解决方案。您可以根据需要更改媒体类型。
@Provider
@Consumes("application/javascript")
public class MyMoxyJSONProvider extends MOXyJsonProvider {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return mediaType.equals(MediaType.valueOf("application/javascript"));
}
}