spring4 版本post接口傳List<Object>類型參數(shù)問題

1遣蚀、需求

通過POST接口傳List<Object> 類型的參數(shù),由于項(xiàng)目比較老誊册,使用的ssh框架,spring的版本是4.0.9暖璧,這種需求在springboot里面很好實(shí)現(xiàn)案怯,可是在老版本的ssh里面就遇到了問題。

2漆撞、問題排查

1殴泰、首先接口信息如下:

@RequestMapping(value = "/receiveHiddens", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public ApiResultJson receiveHiddens(@RequestBody  List<TSBaseUser> users){
        ApiResultJson resultJson = new ApiResultJson();
        System.out.println(users);
        return resultJson;
    }

2、postman測試


image.png

測試報(bào)錯(cuò)結(jié)果如下

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.readWithMessageConverters(HandlerMethodInvoker.java:645)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestBody(HandlerMethodInvoker.java:604)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:353)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:170)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.jeecgframework.core.interceptors.CrosFilter.doFilter(CrosFilter.java:31)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.jeecgframework.core.aop.GZipFilter.doFilter(GZipFilter.java:88)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:140)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:150)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:409)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

3浮驳、debug問題查找
由于是ssh項(xiàng)目悍汛,接口肯定會走DispatchServlet里面的doDispatch()方法,在這個(gè)方法里面一直走下去至会。


image.png

在HandlerMethodInvoker.readWithMessageConverters 方法里面報(bào)錯(cuò)了离咐。具體代碼如下。
在messageConverter.canRead(paramType, contentType)方法里面,繼續(xù)往下找

List<MediaType> allSupportedMediaTypes = new ArrayList();
            if (this.messageConverters != null) {
                HttpMessageConverter[] var6 = this.messageConverters;
                int var7 = var6.length;

                for(int var8 = 0; var8 < var7; ++var8) {
                    HttpMessageConverter<?> messageConverter = var6[var8];
                    allSupportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes());
                    if (messageConverter.canRead(paramType, contentType)) {
                        if (logger.isDebugEnabled()) {
                            logger.debug("Reading [" + paramType.getName() + "] as \"" + contentType + "\" using [" + messageConverter + "]");
                        }

                        return messageConverter.read(paramType, inputMessage);
                    }
                }
            }
public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
        JavaType javaType = this.getJavaType(type, contextClass);
        return this.objectMapper.canDeserialize(javaType) && this.canRead(mediaType);
    }
//上面的 this.canRead(mediaType)是在AbstractHttpMessageConverter里面canRead()方法
protected boolean canRead(MediaType mediaType) {
        if (mediaType == null) {
            return true;
        } else {
            Iterator var2 = this.getSupportedMediaTypes().iterator();

            MediaType supportedMediaType;
            do {
                //就是在這里宵蛀,getSupportedMediaTypes()方法里沒有找到Content type為 'application/json;charset=UTF-8'的昆著,所以報(bào)錯(cuò)
                if (!var2.hasNext()) {
                    return false;
                }

                supportedMediaType = (MediaType)var2.next();
            } while(!supportedMediaType.includes(mediaType));

            return true;
        }
    }

3、分析過程
Content type為 'application/json;charset=UTF-8'是最常見的類型术陶,其它接口都正常凑懂,為什么就這個(gè)接口不行,后來查很多 blog發(fā)現(xiàn)是因?yàn)闆]有配置解析List<Object>類型參數(shù)的解析器梧宫,所以HandlerMethodInvoker無法解析方法參數(shù)接谨,最后找到了解決方法,在xml配置文件里面添加如下配置塘匣,里面重要的就是Jaxb2RootElementHttpMessageConverter和MappingJackson2HttpMessageConverter兩個(gè)messageConverter脓豪,這樣才能正常解析List類型參數(shù)。

<!-- 定義注解驅(qū)動(dòng)Controller方法處理適配器 ,注:該適配器必須聲明在<mvc:annotation-driven />之前忌卤,否則不能正常處理參數(shù)類型的轉(zhuǎn)換 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
            </list>
        </property>
    </bean>

    <!-- 會自動(dòng)注冊RequestMappingHandlerMapping與RequestMappingHandlerAdapter
        兩個(gè)bean,是spring MVC為@Controllers分發(fā)請求所必須的扫夜。 并提供了:數(shù)據(jù)綁定支持,@NumberFormatannotation支持驰徊,@DateTimeFormat支持笤闯,@Valid支持,讀寫XML的支持(JAXB)辣垒,讀寫JSON的支持(Jackson) -->
    <mvc:annotation-driven />

4望侈、postman測試結(jié)果


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末印蔬,一起剝皮案震驚了整個(gè)濱河市勋桶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侥猬,老刑警劉巖例驹,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異退唠,居然都是意外死亡鹃锈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門瞧预,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屎债,“玉大人,你說我怎么就攤上這事垢油∨杈裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵滩愁,是天一觀的道長躯喇。 經(jīng)常有香客問我,道長硝枉,這世上最難降的妖魔是什么廉丽? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任倦微,我火速辦了婚禮,結(jié)果婚禮上正压,老公的妹妹穿的比我還像新娘欣福。我一直安慰自己,他們只是感情好焦履,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布劣欢。 她就那樣靜靜地躺著,像睡著了一般裁良。 火紅的嫁衣襯著肌膚如雪凿将。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天价脾,我揣著相機(jī)與錄音牧抵,去河邊找鬼。 笑死侨把,一個(gè)胖子當(dāng)著我的面吹牛犀变,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秋柄,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼获枝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骇笔?” 一聲冷哼從身側(cè)響起省店,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笨触,沒想到半個(gè)月后懦傍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芦劣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年粗俱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虚吟。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寸认,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出串慰,到底是詐尸還是另有隱情偏塞,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布模庐,位于F島的核電站烛愧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怜姿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一慎冤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沧卢,春花似錦蚁堤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至立磁,卻和暖如春呈队,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唱歧。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工宪摧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颅崩。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓几于,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沿后。 傳聞我的和親對象是個(gè)殘疾皇子沿彭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容