关于Spring3 MVC的 HttpMediaTypeNotSupportedException

本文介绍了解决Dojo AJAX请求与Spring MVC JSON响应不兼容的问题。原因是Dojo默认使用'application/x-www-form-urlencoded'类型,而Spring MVC期望的是'application/json'类型。通过设置Dojo AJAX请求的Content-Type为'application/json;charset=utf-8'来解决此问题。

使用框架:Spring3 MVC + dojo1.8

前提:配置spring MVC以JSON数据形式响应请求

使用场景:dojo向Spring MVC发送ajax请求

异常信息:
[html]  view plain  copy
  1. org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported  
  2.     at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:124)  
  3.     at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:91)  
  4.     at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:71)  
  5.     at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75)  
  6.     at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156)  
  7.     at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)  
  8.     at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)  
  9.     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)  
  10.     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)  
  11.     at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)  
  12.     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)  
  13.     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)  
  14.     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)  
  15.     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:790)  
  16.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)  
  17.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)  
  18.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)  
  19.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)  
  20.     at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)  
  21.     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)  
  22.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)  
  23.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)  
  24.     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:89)  
  25.     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)  
  26.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)  
  27.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)  
  28.     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)  
  29.     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)  
  30.     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:463)  
  31.     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)  
  32.     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)  
  33.     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:564)  
  34.     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:120)  
  35.     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)  
  36.     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)  
  37.     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)  
  38.     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)  
  39.     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)  
  40.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:909)  
  41.     at java.lang.Thread.run(Thread.java:619)  

原因:dojo1.8默认发送的ajax请求类型为'application/x-www-form-urlencoded;charset=UTF-8',但是Spring MVC使用的是‘application/json’,所以需要在dojo的ajax请求中改成'Content-Type' : 'application/json;charset=utf-8',如下代码headers块:

[javascript]  view plain  copy
  1. require([ "dojo/request/xhr""dojo/json" ], function(xhr) {  
  2.             var userInfo = {  
  3.                 "userName" : user.value,  
  4.                 "password" : passwd.value  
  5.             };  
  6.             xhr.post("/SpringMVCRestful/login", {  
  7.                 data : JSON.stringify(userInfo),  
  8.                 //query: JSON.stringify(userInfo), //加这个会在url显示参数  
  9.                 sync : true,  
  10.                 handleAs : "json",  
  11.                 timeout : 200000,  
  12.                 headers : {  
  13.                     'Content-Type' : 'application/json;charset=utf-8'  
  14.                 }  
  15.             }).then(function(response) {  
  16.                 alert(response);  
  17.             }, function(err) {  
  18.                 alert("err:" + err);  
  19.             });  
  20.         });  

问题解决。

参考:stackover

源码下载地址: https://pan.quark.cn/s/a4b39357ea24 【运算单元构造实验报告】运算单元是计算机硬件系统中的关键构成部分,主要承担执行算术运算和逻辑运算的任务。在本次实验中,我们着重探讨了带有累加器的运算单元的设计,涵盖了溢出识别、有符号数值与无符号数值运算的差异性,以及采用补码方式进行的加法与减法运算的实现机制。 一、实验目标 1. 掌握运算单元的基本构造,理解带有累加器的运算单元的具体实现途径。 2. 学习并领会溢出检测的机制,能够设计并构建溢出检测电路,用以判定运算结果是否超出了数据类型的表示范畴。 3. 明辨有符号数值和无符号数值运算的不同特性,把握它们在运算过程中各自的处理方法。 4. 熟练掌握基于补码方式的加法与减法运算的执行,理解补码形式下的溢出判定准则。 5. 熟悉运算单元内部的数据传输路线,明晰数据在运算过程中的流转路径。 6. 设计一个能够支持有符号数值与无符号数值运算、补码加法/减法运算以及有符号数值溢出检测的运算单元电路。 二、实验仪器 采用JZYL—Ⅱ型计算机组成原理实验装置,配备2片74181运算单元芯片作为算术逻辑单元(ALU),2片74LS373用作八位D型锁存器,并辅以一些基础门电路和多路选择器来完成电路设计。 三、实验内容 1. 运用片74181构建一个8位运算单元,负责处理数据的高4位与低4位。 2. 设计并实现溢出检测电路,确保在有符号数值与无符号数值的加法运算中均能准确识别溢出状况。 3. 通过74LS373增加累加器功能,使运算结果得以保存。 4. 将所有设计整合,利用多路选择器来支持有符号数值与无符号数值的加法/减法运算。 四、实验电路 1. 8位运算单元由2片74181构成,通过控制...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值