本文将分享尝试通过JAX-RSWeb服务获取“找不到针对媒体类型=application/json的MessageBodyWriter”,以发送JSON对象的详细内容,此外,我们还将为大家带来关于aj
本文将分享尝试通过JAX-RS Web服务获取“找不到针对媒体类型= application / json的MessageBodyWriter”,以发送JSON对象的详细内容,此外,我们还将为大家带来关于ajax 发送json数据时为什么需要设置contentType: "application/json”、ajax发送json数据时为什么需要设置contentType: "application/json”、android – 如何将applicationJacksonHttpMessageConverter的内容类型从application / json; charset = UTF-8更改为appl、cxf maven 依赖 No message body writer foud.. contenttype:application/json的相关知识,希望对你有所帮助。
本文目录一览:- 尝试通过JAX-RS Web服务获取“找不到针对媒体类型= application / json的MessageBodyWriter”,以发送JSON对象
- ajax 发送json数据时为什么需要设置contentType: "application/json”
- ajax发送json数据时为什么需要设置contentType: "application/json”
- android – 如何将applicationJacksonHttpMessageConverter的内容类型从application / json; charset = UTF-8更改为appl
- cxf maven 依赖 No message body writer foud.. contenttype:application/json
尝试通过JAX-RS Web服务获取“找不到针对媒体类型= application / json的MessageBodyWriter”,以发送JSON对象
我正在尝试通过JAX-RS Web服务发送JSON对象。我的文件web.xml是:
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.notifire</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>
为我要发送的对象建模的类是:
public class GPSCoordinate {
private float latitudine;
private float longitudine;
public float getLatitudine() {
return latitudine;
}
public void setLatitudine(float latitudine) {
this.latitudine = latitudine;
}
public float getLongitudine() {
return longitudine;
}
public void setLongitudine(float longitudine) {
this.longitudine = longitudine;
}
}
根类资源是:
@Path("position")
public class Position {
@Context
private UriInfo context;
@GET
@Produces(MediaType.APPLICATION_JSON)
public GPSCoordinate getHTML() {
GPSCoordinate coord = new GPSCoordinate();
coord.setLatitudine(90.45f);
coord.setLongitudine(34.56f);
return coord;
}
}
现在,当我尝试访问该服务时,将浏览器指向以下链接
http://localhost:8080/Notifire/jaxrs/position
我得到以下错误:
消息org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到针对媒体类型=
application / json的MessageBodyWriter
在我的WEB-INF / lib文件夹中,有了jersey JAX-RS实现的最新版本(jaxrs-ri-2.5.jar)和jersey-
json.jar存档。
任何帮助将非常感激。
ajax 发送json数据时为什么需要设置contentType: "application/json”
1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别?
contentType: "application/json”,首先明确一点,这也是一种文本类型(和text/json一样),表示json格式的字符串,如果ajax中设置为该类型,则发送的json对象必须要使用JSON.stringify进行序列化成字符串才能和设定的这个类型匹配。同时,对应的后端如果使用了Spring,接收时需要使用@RequestBody来注解,这样才能将发送过来的json字符串解析绑定到对应的 pojo 属性上。另外,需注意一点,json字符串在书写时名称部分需要加上“”双引号,以免一些json解析器无法识别。
如ajax 请求时不设置任何contentType,默认将使用contentType: "application/json”application/x-www-form-urlencoded,这种格式的特点就是,name/value 成为一组,
每组之间用 & 联接,而 name与value 则是使用 = 连接。如: www.baidu.com/query?user=username&pass=password 这是get请求, 而 post 请求则是使用请求体,参数不在 url 中,在请求体中的参数表现形式也是: user=username&pass=password的形式。使用这种contentType时,对于简单的json对象类型,如:{“a”:1,"b":2,"c":3} 这种,将也会被转成user=username&pass=password 这种形式发送到服务端。而服务端接收时就按照正常从from表单中接收参数那样接收即可,不需设置@RequestBody之类的注解。但对于复杂的json 结构数据,这种方式处理起来就相对要困难,服务端解析时也难以解析,所以,就有了application/json 这种类型,这是一种数据格式的申明,明确告诉服务端是什么格式的数据,服务端只需要根据这种格式的特点来解析数据即可。
总结:
1).ajax 如果发送的是json字符串,服务端接收时必须要使用@RequestBody注解。始终记住,json字符串,"application/json”,@RequestBody 这三者之间是一一对应的,要有都有,要没有都没有。
2).如果发送的是json对象,contentType不能设置为"application/json”,需使用默认的类型(application/x-www-form-urlencoded,为什么呢?这种类型最后还是会把json对象类型的参数转为user=username&pass=password这种形式后再发送,需要明白一点:这种转换时只能识别json对象类型,不能识别json字符串类型)。
2.application/x-www-form-urlencoded 和 application/json 两种类型的数据在后端如何接收并解析?
application/x-www-form-urlencoded 这种类型的参数提交方式有get和post两种,这两种方式的区别是前者把编码后的user=username&pass=password这种形式的参数放在url上进行提交,后者是放在请求报文的请求体部分进行发送,只是发送数据时数据放的位置不一样。服务端收到 user=username&pass=password 这种形式的参数后,原生的Servlet使用request.getParameter(“user”)的这种形式即可获取参数,spring mvc 中 框架可自动根据参数名进行匹配,即表单元素的name属性和接收参数的名称一样时即可自动匹配,如果不一样,还可以使用@RequestParam的方式匹配。
application/json 字符串数据原生的Servlet中可以使用request.getParameterMap()来获取,但需注意,这种只能获取Get方式传入的数据。post传入的需要使用输入流的方式来读取。在spring mvc中通过@RequestBody来解析并绑定json字符串参数到方法入参。
补充知识(摘录,博文来源:https://blog.csdn.net/ff906317011/article/details/78552426):
@RequestBody 注解详解
作用:
1) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
2) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
使用时机:
A) GET、POST方式提时, 根据request header Content-Type的值来判断:
1)application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
2)multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
3)其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);
B) PUT方式提交时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 必须;multipart/form-data, 不能处理;其他格式, 必须.
ajax发送json数据时为什么需要设置contentType: "application/json”
1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别?
contentType: "application/json”,首先明确一点,这也是一种文本类型(和text/json一样),表示json格式的字符串,如果ajax中设置为该类型,则发送的json对象必须要使用JSON.stringify进行序列化成字符串才能和设定的这个类型匹配。同时,对应的后端如果使用了Spring,接收时需要使用@RequestBody来注解,这样才能将发送过来的json字符串解析绑定到对应的 pojo 属性上。另外,需注意一点,json字符串在书写时名称部分需要加上“”双引号,以免一些json解析器无法识别。
如ajax 请求时不设置任何contentType,默认将使用contentType: "application/json”application/x-www-form-urlencoded,这种格式的特点就是,name/value 成为一组,
每组之间用 & 联接,而 name与value 则是使用 = 连接。如: www.baidu.com/query?user=username&pass=password 这是get请求, 而 post 请求则是使用请求体,参数不在 url 中,在请求体中的参数表现形式也是: user=username&pass=password的形式。使用这种contentType时,对于简单的json对象类型,如:{“a”:1,"b":2,"c":3} 这种,将也会被转成user=username&pass=password 这种形式发送到服务端。而服务端接收时就按照正常从from表单中接收参数那样接收即可,不需设置@RequestBody之类的注解。但对于复杂的json 结构数据,这种方式处理起来就相对要困难,服务端解析时也难以解析,所以,就有了application/json 这种类型,这是一种数据格式的申明,明确告诉服务端是什么格式的数据,服务端只需要根据这种格式的特点来解析数据即可。
总结:
1).ajax 如果发送的是json字符串,服务端接收时必须要使用@RequestBody注解。始终记住,json字符串,"application/json”,@RequestBody 这三者之间是一一对应的,要有都有,要没有都没有。
2).如果发送的是json对象,contentType不能设置为"application/json”,需使用默认的类型(application/x-www-form-urlencoded,为什么呢?这种类型最后还是会把json对象类型的参数转为user=username&pass=password这种形式后再发送,需要明白一点:这种转换时只能识别json对象类型,不能识别json字符串类型)。
2.application/x-www-form-urlencoded 和 application/json 两种类型的数据在后端如何接收并解析?
application/x-www-form-urlencoded 这种类型的参数提交方式有get和post两种,这两种方式的区别是前者把编码后的user=username&pass=password这种形式的参数放在url上进行提交,后者是放在请求报文的请求体部分进行发送,只是发送数据时数据放的位置不一样。服务端收到 user=username&pass=password 这种形式的参数后,原生的Servlet使用request.getParameter(“user”)的这种形式即可获取参数,spring mvc 中 框架可自动根据参数名进行匹配,即表单元素的name属性和接收参数的名称一样时即可自动匹配,如果不一样,还可以使用@RequestParam的方式匹配。
application/json 字符串数据原生的Servlet中可以使用request.getParameterMap()来获取,但需注意,这种只能获取Get方式传入的数据。post传入的需要使用输入流的方式来读取。在spring mvc中通过@RequestBody来解析并绑定json字符串参数到方法入参。
补充知识(摘录,博文来源:https://blog.csdn.net/ff906317011/article/details/78552426):
@RequestBody 注解详解
作用:
1) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
2) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
使用时机:
A) GET、POST方式提时, 根据request header Content-Type的值来判断:
1)application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
2)multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
3)其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);
B) PUT方式提交时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 必须;multipart/form-data, 不能处理;其他格式, 必须.
本文转自:https://www.cnblogs.com/hanszhao/p/10166277.html
android – 如何将applicationJacksonHttpMessageConverter的内容类型从application / json; charset = UTF-8更改为appl
我有一个Spring REST Web服务,在我的控制器中,我使用MappingJacksonHttpMessageConverter将我的返回模型转换为JSON.但是当我用firebug检查它时,有Content-Type = application / json; charset = UTF-8.
此外,我试图通过使用spring android rest模板从Android客户端解析此结果但我不断得到:
Could not extract response: no
suitable HttpMessageConverter found
for response type
[xxx.SamplePageActivity$Result] and
content type
application/json;charset=UTF-8]
可能是android客户端上的MappingJacksonHttpMessageConverter完全期望类型application / json的情况
所以我的问题是如何改变spring的MappingJacksonHttpMessageConverter从application / json返回Content-Type; charset = UTF-8到application / json.
这是我的视图解析器配置.这可能很有用:
<beans:bean>
<beans:property name="mediaTypes">
<beans:map>
<beans:entry key="html" value="text/html" />
<beans:entry key="json" value="application/json" />
</beans:map>
</beans:property>
<beans:property name="viewResolvers">
<beans:list>
<beans:bean>
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value="${dispatcher.suffix}" />
</beans:bean>
</beans:list>
</beans:property>
<beans:property name="defaultviews">
<beans:list>
<beans:beanhttps://www.jb51.cc/tag/njs/" target="_blank">njsonView" />
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="messageAdapter">
<beans:property name="messageConverters">
<beans:list>
<!-- Support JSON -->
<beans:bean/>
</beans:list>
</beans:property>
</beans:bean>
解决方法:
您可以使用supportedMediaTypes属性更精确地配置MappingJacksonHttpMessageConverter,如下所示:
<bean>
<property name="supportedMediaTypes">
<list>
<bean>
<constructor-arg value="application" />
<constructor-arg value="json" />
<constructor-arg value="#{T(java.nio.charset.Charset).forName('UTF-8')}"/>
</bean>
</list>
</property>
</bean>
根据文档(http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/http/MediaType.html),您可以按顺序设置类型,子类型和字符集 –
cxf maven 依赖 No message body writer foud.. contenttype:application/json
最近使用 cxf 发布 rest 服务时遇到了如题的异常,最后发现是缺少依赖的问题.ps: 我并没有使用 spring
cxf 基本运行需要如下依赖
1 <dependency>
2 <groupId>org.apache.cxf</groupId>
3 <artifactId>cxf-core</artifactId>
4 <version>${cxf.version}</version>
5 </dependency>
6 <dependency>
7 <groupId>org.apache.cxf</groupId>
8 <artifactId>cxf-rt-frontend-jaxws</artifactId>
9 <version>${cxf.version}</version>
10 </dependency>
11 <dependency>
12 <groupId>org.apache.cxf</groupId>
13 <artifactId>cxf-rt-transports-http</artifactId>
14 <version>${cxf.version}</version>
15 </dependency>
16 <dependency>
17 <groupId>org.apache.cxf</groupId>
18 <artifactId>cxf-rt-transports-http-jetty</artifactId>
19 <version>${cxf.version}</version>
20 </dependency>
如果想要发布 rest 风格的服务,需要添加如下依赖 (看各人需要,有的可能需要添加 rs-api 的依赖)
1 <!-- rest风格支持 -->
2 <dependency>
3 <groupId>org.apache.cxf</groupId>
4 <artifactId>cxf-rt-frontend-jaxrs</artifactId>
5 <version>${cxf.version}</version>
6 </dependency>
7 <dependency>
8 <groupId>org.apache.cxf</groupId>
9 <artifactId>cxf-rt-rs-extension-providers</artifactId>
10 <version>${cxf.version}</version>
11 </dependency>
这样就可以发布 rest 风格的服务了,不过这样有个问题,只能使用 xml 格式的数据,如果使用下面的注解,即添加 json 格式的返回数据访问时会报如题的 no message body writer 的异常
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
所以需要添加如下依赖
1 <!-- json支持 -->
2 <dependency>
3 <groupId>org.codehaus.jettison</groupId>
4 <artifactId>jettison</artifactId>
5 <version>${jettison.version}</version>
6 </dependency>
总结:出现 no message body writer 时先检查 pojo 上是否添加了 jaxb 的必要标记 ----@XmlRootElement, 其次检查是否缺少依赖关系
关于尝试通过JAX-RS Web服务获取“找不到针对媒体类型= application / json的MessageBodyWriter”,以发送JSON对象的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ajax 发送json数据时为什么需要设置contentType: "application/json”、ajax发送json数据时为什么需要设置contentType: "application/json”、android – 如何将applicationJacksonHttpMessageConverter的内容类型从application / json; charset = UTF-8更改为appl、cxf maven 依赖 No message body writer foud.. contenttype:application/json等相关知识的信息别忘了在本站进行查找喔。
本文标签: