由于公司对SpingMVC框架里面的东西进行了扩展,在配置SpringMVC时没有使用<mvc:annotation-driven>这个标签。而且是自己手动来配置HandlerMapping和HandlerAdapter。在处理跨域请求时,就抛No adapter for handler 异常了。记录下该异常的解决过程,方便后续查询。

一、异常信息

    具体的异常信息如下:
threw exception [No adapter for handler [org.springframework.web.servlet.handler.AbstractHandlerMapping$PreFlightHandler@edcb4b4]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler] with root cause
javax.servlet.ServletException: No adapter for handler [org.springframework.web.servlet.handler.AbstractHandlerMapping$PreFlightHandler@edcb4b4]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1202)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:947)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doOptions(FrameworkServlet.java:908)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:657)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
x
 
1
threw exception [No adapter for handler [org.springframework.web.servlet.handler.AbstractHandlerMapping$PreFlightHandler@edcb4b4]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler] with root cause
2
javax.servlet.ServletException: No adapter for handler [org.springframework.web.servlet.handler.AbstractHandlerMapping$PreFlightHandler@edcb4b4]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
3
    at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1202)
4
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:947)
5
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
6
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
7
    at org.springframework.web.servlet.FrameworkServlet.doOptions(FrameworkServlet.java:908)
8
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:657)
9
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
10
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

二、问题的解决

(1)异常的分析
    分析上面的异常信息,发现是在doOptions没找到合适的HandlerAdapter。跨域请求时是会发送2个请求的,第一个是就是options类型的请求。所以这里的问题就是在处理options请求时。
    再看了下代码中配置的HandlerAdapter,配置代码如下图
    注册的HandlerAdapter实例为 RequestMappingHandlerAdapter,于是我怀疑是这个RequestMappingHandlerAdapter不支持options类型的请求。
(2)验证自己的想法
    带着怀疑的想法,把xml配置中手动配置的HandlerAdapter给去掉了,然后加上<mvc:annotation-driven>这个标签。再运行项目,发现跨域请求居然可以处理了。说明确实是有handlerAdapter没有配置上去。
    debug了DispatcherServlet下里面的代码,发现处理options请求时需要的handlerAdapter是HttpRequestHandlerAdapter的实例。因此问题的根源就是我们的SpringMVC的配置中没有配置HttpRequestHandlerAdapter,导致没有找到支持options类型请求的handlerAdapter。
(3)解决问题
    由于框架的问题,不适合直接使用<mvc:annotation-driven>这个标签(用了会导致扩展的功能失效)。分析了<mvc:annotation-driven>这个标签可知它会实例化3个HandlerAdapter,而我的配置文件只实例化了一个RequestMappingHandlerAdapter。因此我把另外两个handlerAdapter的实例也添加到配置文件中了。另外2个handlerAdapter的其中之一就是HttpRequestHandlerAdapter,这个handlerAdapter就可以处理options请求。
    我把代码还原至没添加<mvc:annotation-driven>的状态,然后在注册RequestMappingHandlerAdapter的代码后面加上如下代码:
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
2
 
1
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
2
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

三、小结

    (1)SpringMVC处理Options类型的请求,需要HttpRequestHandlerAdapter,如果没有就会抛异常
    (2)当我们不使用<mvc:annotation-driven>这个标签时,尽量手动把它会注册的HandlerAdapter都注册一遍,防止出现No adapter for handler的异常


SpringMVC处理跨域请求时的一个注意事项的更多相关文章

  1. SpringMvc+ajax跨域请求时,出现options类型的请求并返回403的解决方案

    在使用 $.ajax({ url:'http://127.0.0.1:8081/rest/ccxxx/xxxx', type:'POST', dataType:"json", co ...

  2. 为什么返回的数据前面有callback? ashx/json.ashx?的后面加 callback=? 起什么作用 js url?callback=xxx xxx的介绍 ajax 跨域请求时url参数添加callback=?会实现跨域问题

    为什么返回的数据前面有callback?   这是一个同学出现的问题,问到了我. 应该是这样的: 但问题是这样的: 我看了所请求的格式和后台要求的也是相同的.而且我也是这种做法,为什么他的就不行呢? ...

  3. javascript fetch 跨域请求时 session失效问题

    javascript 使用fetch进行跨域请求时默认是不带cookie的,所以会造成 session失效. fetch(url, { method: 'POST', credentials: 'in ...

  4. ajax跨域请求时,sessionId不一样,导致无法记住登陆状态

    遇到这样一个场景,就是前端的域是dev,请求接口时,接口的域是beta,即使在服务端设置了cookie存放的域,'COOKIE_DOMAIN'   =>  '.roboming.com',虽然c ...

  5. 在用AJAX跨域请求时遇到的问题

    刚刚接触ajax就遇到一个词--跨域. 在我百度了各种资料以后总结了一句话:“只要不是在一个协议.域.名端口下,都属于跨域(127.0.0.1本地也属于跨域)”. 在做ajax请求的时候,请求不到并且 ...

  6. SpringMVC支持跨域请求

    一.如果项目中使用的SpringMVC4.3.9以下,就需要对该请求配置Filter,设置请求头可支持跨域.使用方法: --spring cloud zuul支持跨域---:https://blog. ...

  7. ajax 跨域请求时url参数添加callback=?会实现跨域问题

    例如: 1.在 jQuery 中,可以通过使用JSONP 形式的回调函数来加载其他网域的JSON数据,如 "myurl?callback=?".jQuery 将自动替换 ? 为正确 ...

  8. 关于.Net Core 前后端分离跨域请求时 ajax并发请求导致部分无法通过验证解决办法。

    项目中有这样一个页面.页面加载的时候会同时并发6个ajax请求去后端请求下拉框. 这样会导致每次都有1~2个“浏览器预请求”不通过. 浏览器为什么会自动发送“预请求”?请看以面连接 https://b ...

  9. jquery ajax在IE9以下进行跨域请求时无效的问题

    第一步:设置浏览器安全属性,启用[通过域访问数据源]选项: 1.选择Internet选项 2.选择安全---自定义级别 3.找到其他---通过域访问数据源,选择启用,然后确定就可以了. 第二步:调用a ...

随机推荐

  1. <自动化测试方案_5>第五章、代码单元自动化测试

    第五章.代码单元自动化测试 代码单元测试需要根据编程语言,选择单元测试框架,然后访问类方法,函数.代码单元测试做自动化,相比API.UI自动化做起来更加麻烦,建议放到待API自动化测试.UI自动化测试 ...

  2. 深圳共创力“研发管理&知识管理”高端研讨交流会在深圳举办!

    2017/4/8,由深圳市共创力企业管理咨询公司举办的“研发管理&知识管理”高端研讨会在深圳市南山区圣淘沙国际酒店(翡翠店)隆重召开.此次研讨会由共创力总经理.首席顾问杨学明先生主持.研讨会先 ...

  3. [Python][小知识][NO.1] Python字符串前 加 u、r、b 的含义

    1.字符串前加 u 例:u"我是含有中文字符组成的字符串." 作用:后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出 ...

  4. mysql之系统默认数据库

    相关内容: 系统默认数据库information_schema,performance_schema,mysql,test  的意义 首发时间:2018-02-23 17:10 安装mysql完成后, ...

  5. (python)数据结构---字典

    一.描述 由键值key-value组成的数据的集合 可变.无序的,key不可以重复 字典的键key要可hash(列表.字典.集合不可哈希),不可变的数据结构是可哈希的(字符串.元组.对象.bytes) ...

  6. LeetCode题解之 Assign Cookies

    1.题目描述 2.问题分析 使用贪心算法. 3 代码 class Solution { public: int findContentChildren(vector<int>& g ...

  7. java防止double和float精度丢失的方法

    在浮点数当中做运算时经常会出现精度丢失的情况,如果做项目不作处理的话会对商家造成很大的影响的.项目尤其是金融相关的项目对这些运算的精度要求较高. 问题原因:首先计算机进行的是二进制运算,我们输入的十进 ...

  8. MySQL并行复制的一个坑

    早上巡检数据库,发现一个延迟从库的sql_thread中断了. Last_SQL_Errno: 1755 Last_SQL_Error: Cannot execute the current even ...

  9. win10监听剪切板变化

    一.第一步导入api #region [DllImport("user32.dll")] public static extern bool AddClipboardFormatL ...

  10. 在Unity中对Lua进行调试

    前言 接我之前的文章,讲到使用IntelliJ IDEA(做为Lua的编辑器)+EmmlyLua(插件),当然EmmlyLua也提供调试功能的. Lua代码提示和方法跳转 在Lua中提示UnityEn ...