未找到媒体类型 = 应用程序/八位字节流的 MessageBodyReader
Posted
技术标签:
【中文标题】未找到媒体类型 = 应用程序/八位字节流的 MessageBodyReader【英文标题】:MessageBodyReader not found for media type=application/octet-stream 【发布时间】:2013-11-19 17:25:51 【问题描述】:我正在尝试使用以下代码 sn-p 从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: , 类型=类 com.app.weather.providers.org.openweathermap.pojo.WeatherForecast, genericType=类 com.app.weather.providers.org.openweathermap.pojo.WeatherForecast。
pom.xml 中的泽西依赖关系:
<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>
此代码在应用程序服务器之外运行。谢谢。
【问题讨论】:
【参考方案1】: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 媒体类型:
jersey-media-moxy-2.15.jar org.eclipse.persistence.core-2.5.0-rc2.jar org.eclipse.persistence.antlr-2.5.0.jar org.eclipse.persistence.moxy-2.5.0.jar jersey-entity-filtering-2.3.1.jar用法:
一些普通的类:
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);
服务器的json响应(http://localhost:8084/myhost/test
)必须是以下格式:
"name":"haleh", "id":3
【讨论】:
【参考方案2】:通过编写自定义 MessageBodyReader 解决。 https://jersey.java.net/documentation/latest/message-body-workers.html#d0e4072
【讨论】:
【参考方案3】:我遇到了类似的问题,尝试解组使用媒体类型“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"));
【讨论】:
以上是关于未找到媒体类型 = 应用程序/八位字节流的 MessageBodyReader的主要内容,如果未能解决你的问题,请参考以下文章
谷歌浏览器给出警告资源解释为字体但使用 MIME 类型应用程序/八位字节流传输:
Spring Android POST在ResponseEntity中没有返回类型应用程序/八位字节流