【求助】SpringMVC中Cnotroller响应Json数据报错406

EndlessDarkness 2018-03-20 10:41:35
SpringMVC版本3.2.13-release

已导入jackson-core-asl-1.9.11.jar和jackson-mapper-asl-1.9.11.jar,
配置了<mvc:annotation-driven />,
Controller中也使用了@ResponseBody。

目标:异步请求SpringMVC的Controller,直接返回数据,不跳转页面。

出现的问题:SpringMVC中尝试用@ResponseBody返回对象或String时,报Http406错误。

可能的原因:在web.xml中配置了RESTFul风格路径,设置了<servlet-mapping>/</servlet-mapping>,引起请求转发并解析视图,而Controller中返回的是数据,导致Not Acceptable错误。

web.xml配置


测试用Controller


还有就是在网上找到说需要配置Json视图解析器,之前只配置过InternalResourceViewResolver,然后试着配Json的解析器,可试了几个都错了,不是ClassNotFound就是NoClassDefFoundError。
...全文
686 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
EndlessDarkness 2018-03-27
  • 打赏
  • 举报
回复
引用 14 楼 weixin_39309867 的回复:
我用的是这个
谢啦,用了gson后,问题解决了。
_小_小_ 2018-03-21
  • 打赏
  • 举报
回复
json 当然 要用fastjson啦. 406 请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。   除非这是一个 HEAD 请求,否则该响应就应当返回一个包含可以让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由 Content-Type 头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行作出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准。
诺丽果 2018-03-20
  • 打赏
  • 举报
回复
你把你的controller中的 @ResponseBody放在@RequestMapping("/searchMenuList")上面,而且还有 把list转一下Json格式,网上很多类,
public String responseMap(
			int code, 
			String msg,
			Object info, 
			Map<String, Object> params
			) {
		Map<String, Object> map = new HashMap<String, Object>();
		String result = code == 200 ? "true" : "false";
		map.put("result", result);
		map.put("msg", msg);
		map.put("info", info);

//		if (info == null) {
//			map.put("info", "");
//		} else
//			map.put("info", info);

		if (null != params) {
			for (String key : params.keySet()) {
				map.put(key, params.get(key));
			}
		}
		// Gson gson = new Gson();
		String s = null;
		Gson gson = new GsonBuilder()
				.serializeNulls()
				.setDateFormat("yyyy-MM-dd HH:mm:ss")
				.create();
		String json = gson.toJson(map);
		
		return json;
	}
,具体运用就是
String json = responseMap(200, "连接成功", menuList, null);
方元之外 2018-03-20
  • 打赏
  • 举报
回复
包不完整 包冲突 包导入错误(不是这个包) 或者包的版本不对
appleyk 2018-03-20
  • 打赏
  • 举报
回复
引用 4 楼 EndlessDarkness 的回复:
[quote=引用 3 楼 Appleyk 的回复:] 先来个简单的对象,如果还不行的话,升级spring版本
那为什么会报406呀?是因为返回视图方面的问题?还是Json配置的问题?[/quote] 网上的,试试第二种 @responseBody注解的使用 1、   @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML   数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。 2、     @RequestMapping("/login")   @ResponseBody   public User login(User user){     return user;   }   User字段:userName pwd   那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'   效果等同于如下代码:   @RequestMapping("/login")   public void login(User user, HttpServletResponse response){     response.getWriter.write(JSONObject.fromObject(user).toString());   } 正常情况下,加了@responseBody就不用管了
EndlessDarkness 2018-03-20
  • 打赏
  • 举报
回复
引用 3 楼 Appleyk 的回复:
先来个简单的对象,如果还不行的话,升级spring版本
那为什么会报406呀?是因为返回视图方面的问题?还是Json配置的问题?
appleyk 2018-03-20
  • 打赏
  • 举报
回复
先来个简单的对象,如果还不行的话,升级spring版本
appleyk 2018-03-20
  • 打赏
  • 举报
回复
web.xml




Controller

package com.appleyk.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


class A{
public A(String name,int age){
this.name = name ;
this.age = age ;
}
String name;
int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

@Controller
@RequestMapping("/api/v1.0.1/test")
public class TestController {

@RequestMapping("/hello")
@ResponseBody
public List<A> getAList(HttpServletResponse response){

List<A> lists = new ArrayList<>();
A a = new A("appleyk",27);
lists.add(a);

return lists;
}
}



测试




EndlessDarkness 2018-03-20
  • 打赏
  • 举报
回复
因为之前半年一直在做ASP.NET的项目,它的Controller里面自带JsonResult,就没深想这方面
诺丽果 2018-03-20
  • 打赏
  • 举报
回复
我用的是这个
EndlessDarkness 2018-03-20
  • 打赏
  • 举报
回复
引用 10 楼 weixin_39309867 的回复:
你用我给你写的那个代码,通过responseMap()方法,把menuList转成json返回就行了
朋友,你这个要用到Gson吧?需要限制版本吗?有没有依赖什么的?还是说找个2.几的版本就可以了?
EndlessDarkness 2018-03-20
  • 打赏
  • 举报
回复
引用 10 楼 weixin_39309867 的回复:
你用我给你写的那个代码,通过responseMap()方法,把menuList转成json返回就行了
好吧,谢啦,我也该放弃了,从Jackson到JSON-lib只要用引入的东西,就报NotDef,绝了
maradona1984 2018-03-20
  • 打赏
  • 举报
回复
可以考虑不用jackson
诺丽果 2018-03-20
  • 打赏
  • 举报
回复
你用我给你写的那个代码,通过responseMap()方法,把menuList转成json返回就行了
EndlessDarkness 2018-03-20
  • 打赏
  • 举报
回复
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper at org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1260) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2522) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2511) 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) Caused by: java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper at com.controller.MenuController.searchMenuList(MenuController.java:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:743) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:672) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:82) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919) ... 31 more Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.map.ObjectMapper at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1854) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1703) ... 43 more 三月 20, 2018 1:48:42 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet [springmvc] in context with path [/sport] threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper] with root cause java.lang.ClassNotFoundException: org.codehaus.jackson.map.ObjectMapper at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1854) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1703) at com.controller.MenuController.searchMenuList(MenuController.java:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:743) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:672) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:82) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2522) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2511) 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)
EndlessDarkness 2018-03-20
  • 打赏
  • 举报
回复
引用 7 楼 weixin_39309867 的回复:
你把你的controller中的 @ResponseBody放在@RequestMapping("/searchMenuList")上面,而且还有 把list转一下Json格式,网上很多类,
public String responseMap(
			int code, 
			String msg,
			Object info, 
			Map<String, Object> params
			) {
		Map<String, Object> map = new HashMap<String, Object>();
		String result = code == 200 ? "true" : "false";
		map.put("result", result);
		map.put("msg", msg);
		map.put("info", info);

//		if (info == null) {
//			map.put("info", "");
//		} else
//			map.put("info", info);

		if (null != params) {
			for (String key : params.keySet()) {
				map.put(key, params.get(key));
			}
		}
		// Gson gson = new Gson();
		String s = null;
		Gson gson = new GsonBuilder()
				.serializeNulls()
				.setDateFormat("yyyy-MM-dd HH:mm:ss")
				.create();
		String json = gson.toJson(map);
		
		return json;
	}
,具体运用就是
String json = responseMap(200, "连接成功", menuList, null);
谢谢,刚才把返回值换成String测试了一下就好了,也就是返回值类型不匹配的问题。现在问题就是怎么转成Json了。 然后现在用了Jackson1.9.11,明明已经导入项目了,可还是报类未定义的错,但我是直接在Controller里创建的对象,没用依赖注入啊。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧