GVKun编程网logo

尝试通过JAX-RS Web服务获取“找不到针对媒体类型= application / json的MessageBodyWriter”,以发送JSON对象

5

本文将分享尝试通过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对象

尝试通过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:

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:

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

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 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等相关知识的信息别忘了在本站进行查找喔。

本文标签: