我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringMVC @ResponseBody 415错误处理方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringMVC @ResponseBody 415错误处理方式

闲话少说,刚开始用SpringMVC, 页面要使用jquery的ajax请求Controller。 但总是失败,

主要表现为以下两个异常为:

异常一:java.lang.ClassNotFoundException: org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

异常二:SpringMVC @ResponseBody 415错误处理

网上分析原因很多,但找了很久都没解决,基本是以下几类:

  • springmvc添加配置、注解;
  • pom.xml添加jackson包引用;
  • Ajax请求时没有设置Content-Type为application/json
  • 发送的请求内容不要转成JSON对象,直接发送JSON字符串即可

这些其实都没错!!!

以下是我分析的解决步骤方法

1、springMVC配置文件开启注解


   <!-- 开启注解-->
    <mvc:annotation-driven />

2、添加springMVC需要添加如下配置

(这个要注意spring版本,3.x和4.x配置不同)

spring3.x是org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

spring4.x是org.springframework.http.converter.json.MappingJackson2HttpMessageConverter

具体可以查看spring-web的jar确认,哪个存在用哪个!

spring3.x配置:


	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="jsonHttpMessageConverter" />
			</list>
		</property>
	</bean>
 
	<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json;charset=UTF-8</value>
			</list>
		</property>
	</bean>

spring4.x配置:


	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="jsonHttpMessageConverter" />
			</list>
		</property>
	</bean>
 
	<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json;charset=UTF-8</value>
			</list>
		</property>
	</bean>

3、pom.xml添加jackson依赖

(这个要注意spring版本,3.x和4.x配置不同

如果是spring 3.x,pom.xml添加如下配置


       <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-lgpl</artifactId>
            <version>1.8.1</version>
         </dependency>
 
 
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-lgpl</artifactId>
            <version>1.8.1</version>
        </dependency></span>

spring4.x, pom.xml添加如下配置


	    <dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.5.2</version>
		</dependency>
		
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.5.2</version>
		</dependency>

这里要说明一下,spring3.x用的是org.codehaus.jackson的1.x版本,在maven资源库,已经不在维护,统一迁移到com.fasterxml.jackson,版本对应为2.x

4、ajax请求要求

  • dataType 为 json
  • contentType 为 'application/json;charse=UTF-8'
  • data 转JSON字符串

我的代码:如下: (注意:这里只是针对POST +JSON字符串形式请求,后面我会详细讲解不同形式请求,的处理方法和案例)


         var data = {
		userAccount: lock_username,
		userPasswd:hex_md5(lock_password).toUpperCase()
	 }
	 
	 $.ajax({
			url : ctx + "/unlock.do",
			type : "POST",
			data : JSON.stringify(data),
		        dataType: 'json',
	                contentType:'application/json;charset=UTF-8',    
			success : function(result) {
				console.log(result);
			}
	 });

5、Controller 接收响应JSON

以上配置OK,Controller中使用JSON方式有多种。这里简单介绍几种。

这个关键在于ajax请求是将数据以什么形式传递到后台,这里我总结了三种形式

  • POST + JSON字符串形式
  • POST + JSON对象形式
  • GET + 参数字符串

方式一: POST + JSON字符串形式,如下:


//请求数据,登录账号 +密码
	 var data = {
			 userAccount: lock_username,
			 userPasswd:hex_md5(lock_password).toUpperCase()
	 }
	 
	 $.ajax({
			url : ctx + "/unlock.do",
			type : "POST",
			data : JSON.stringify(data), //转JSON字符串
		    dataType: 'json',
	        contentType:'application/json;charset=UTF-8', //contentType很重要   
			success : function(result) {
				console.log(result);
			}
	 });

方式二: POST + JSON对象形式,如下:


	 
	 //请求数据,登录账号 +密码
 var data = {
			 userAccount: lock_username,
			 userPasswd:hex_md5(lock_password).toUpperCase()
	 }
	 
	 $.ajax({
			url : ctx + "/unlock.do",
			type : "POST",
			data : data, //直接用JSON对象
		    dataType: 'json',
			success : function(result) {
				console.log(result);
			}
	 });

代码案例:

5-1: 使用@RequestBody来设置输入 ,@ResponseBody设置输出 (POST + JSON字符串形式)

JS请求:


	 //请求数据,登录账号 +密码
	 var data = {
			 userAccount: lock_username,
			 userPasswd:hex_md5(lock_password).toUpperCase()
	 }
	 
	 $.ajax({
			url : ctx + "/unlock.do",
			type : "POST",
			data : JSON.stringify(data), //转JSON字符串
		    dataType: 'json',
	        contentType:'application/json;charset=UTF-8', //contentType很重要   
			success : function(result) {
				console.log(result);
			}
	 });
 

Controller处理:


    @RequestMapping(value = "/unlock", method = RequestMethod.POST,consumes = "application/json") 
    @ResponseBody
    public Object unlock(@RequestBody User user) {  
		JSONObject jsonObject = new JSONObject();  
		
		try{
			Assert.notNull(user.getUserAccount(), "解锁账号为空");
			Assert.notNull(user.getUserPasswd(), "解锁密码为空");
			
			User currentLoginUser = (User) MvcUtils.getSessionAttribute(Constants.LOGIN_USER);
			Assert.notNull(currentLoginUser, "登录用户已过期,请重新登录!");
			
			Assert.isTrue(StringUtils.equals(user.getUserAccount(),currentLoginUser.getUserAccount()), "解锁账号错误");
			Assert.isTrue(StringUtils.equalsIgnoreCase(user.getUserPasswd(),currentLoginUser.getUserPasswd()), "解锁密码错误");
			
jsonObject.put("message", "解锁成功");  
jsonObject.put("status", "success");
		}catch(Exception ex){
			jsonObject.put("message", ex.getMessage());  
		        jsonObject.put("status", "error");
		}
       return jsonObject;  
    }  

浏览器控制台输出:

5-2: 使用HttpEntity来实现输入绑定,来ResponseEntit输出绑定(POST + JSON字符串形式)

JS请求:


	 //请求数据,登录账号 +密码
	 var data = {
			 userAccount: lock_username,
			 userPasswd:hex_md5(lock_password).toUpperCase()
	 }
	 
	 $.ajax({
			url : ctx + "/unlock.do",
			type : "POST",
			data : JSON.stringify(data), //转JSON字符串
		    dataType: 'json',
	        contentType:'application/json;charset=UTF-8', //contentType很重要   
			success : function(result) {
				console.log(result);
			}
	 });

Controller处理:


	
    @RequestMapping(value = "/unlock", method = RequestMethod.POST,consumes = "application/json") 
    public ResponseEntity<Object> unlock(HttpEntity<User> user) {  
		JSONObject jsonObject = new JSONObject();  
		
		try{
			Assert.notNull(user.getBody().getUserAccount(), "解锁账号为空");
			Assert.notNull(user.getBody().getUserPasswd(), "解锁密码为空");
			
			User currentLoginUser = (User) MvcUtils.getSessionAttribute(Constants.LOGIN_USER);
			Assert.notNull(currentLoginUser, "登录用户已过期,请重新登录!");
			
			Assert.isTrue(StringUtils.equals(user.getBody().getUserAccount(),currentLoginUser.getUserAccount()), "解锁账号错误");
			Assert.isTrue(StringUtils.equalsIgnoreCase(user.getBody().getUserPasswd(),currentLoginUser.getUserPasswd()), "解锁密码错误");
			
	               jsonObject.put("message", "解锁成功");  
	               jsonObject.put("status", "success");
		}catch(Exception ex){
			jsonObject.put("message", ex.getMessage());  
		        jsonObject.put("status", "error");
		}
		ResponseEntity<Object> responseResult = new ResponseEntity<Object>(jsonObject,HttpStatus.OK);
	        return responseResult;
    }  

5-3: 使用request.getParameter获取请求参数,响应JSONPOST + JSON对象形式) 和(GET + 参数字符串),Controller处理一样,区别在于是否加注解method ,

  • 如果不加适用GET + POST ;
  • 如果 method= RequestMethod.POST,用于POST 请求;
  • 如果method=RequestMethod.GET,用于GET请求;

POST+ JSON对象形式请求:


 var data = {
			 userAccount: lock_username,
			 userPasswd:hex_md5(lock_password).toUpperCase()
	 }
	 
	 $.ajax({
			url : ctx + "/unlock.do",
			type : "POST",
			data : data,
		    dataType: 'json',
			success : function(result) {
				console.log(result);
			}
	 });

GET + 参数字符串请求:


	 $.ajax({
			url : ctx + "/unlock.do",
			type : "GET",
			dataType: "text", 
			data : "userAccount="+lock_username+"&userPasswd=" + hex_md5(lock_password).toUpperCase(),//等价于URL后面拼接参数
			success : function(result) {
				console.log(result);
			}
	 });

Controller处理:


	
	@RequestMapping(value = "/unlock") 
    public void unlock(HttpServletRequest request,HttpServletResponse response)  throws IOException {  
		JSONObject jsonObject = new JSONObject();  
		
		String userAccount = (String)request.getParameter("userAccount");
		String userPasswd = (String)request.getParameter("userPasswd");
		try{
			Assert.notNull(userAccount, "解锁账号为空");
			Assert.notNull(userPasswd, "解锁密码为空");
			
			User currentLoginUser = (User) MvcUtils.getSessionAttribute(Constants.LOGIN_USER);
			Assert.notNull(currentLoginUser, "登录用户已过期,请重新登录!");
			
			Assert.isTrue(StringUtils.equals(userAccount,currentLoginUser.getUserAccount()), "解锁账号错误");
			Assert.isTrue(StringUtils.equalsIgnoreCase(userPasswd,currentLoginUser.getUserPasswd()), "解锁密码错误");
			
	        jsonObject.put("message", "解锁成功");  
	        jsonObject.put("status", "success");
		}catch(Exception ex){
			jsonObject.put("message", ex.getMessage());  
		    jsonObject.put("status", "error");
		}
		
        response.getWriter().print(jsonObject.toString());  
    }  

5-4: 使用@ModelAttribute将参数封装对象,响应JSON(POST + JSON对象形式) 和(GET + 参数字符串),Controller处理一样,区别在于是否加注解method 。

  • 如果不加适用GET + POST ;
  • 如果 method= RequestMethod.POST,用于POST 请求;
  • 如果method=RequestMethod.GET,用于GET请求;

POST+ JSON对象形式请求:


	 var data = {
			 userAccount: lock_username,
			 userPasswd:hex_md5(lock_password).toUpperCase()
	 }
	 
	 $.ajax({
			url : ctx + "/unlock.do",
			type : "POST",
			data : data,
		    dataType: 'json',
			success : function(result) {
				console.log(result);
			}
	 });

GET + 参数字符串请求:


	 $.ajax({
			url : ctx + "/unlock.do",
			type : "GET",
			dataType: "text", 
			data : "userAccount="+lock_username+"&userPasswd=" + hex_md5(lock_password).toUpperCase(),//等价于URL后面拼接参数
			success : function(result) {
				console.log(result);
			}
	 });

Controller处理:(这个案例只支持POST)


	
	@RequestMapping(value = "/unlock",method = RequestMethod.POST) 
    public void unlock(@ModelAttribute("user") User user,PrintWriter printWriter)  throws IOException {  
		JSONObject jsonObject = new JSONObject();  
		
		try{
			Assert.notNull(user.getUserAccount(), "解锁账号为空");
			Assert.notNull(user.getUserPasswd(), "解锁密码为空");
			
			User currentLoginUser = (User) MvcUtils.getSessionAttribute(Constants.LOGIN_USER);
			Assert.notNull(currentLoginUser, "登录用户已过期,请重新登录!");
			
			Assert.isTrue(StringUtils.equals(user.getUserAccount(),currentLoginUser.getUserAccount()), "解锁账号错误");
			Assert.isTrue(StringUtils.equalsIgnoreCase(user.getUserPasswd(),currentLoginUser.getUserPasswd()), "解锁密码错误");
			
	        jsonObject.put("message", "解锁成功");  
	        jsonObject.put("status", "success");
		}catch(Exception ex){
			jsonObject.put("message", ex.getMessage());  
		    jsonObject.put("status", "error");
		}
		printWriter.print(jsonObject.toString());
    }  

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringMVC @ResponseBody 415错误处理方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

springmvc错误处理机制是什么

这篇“springmvc错误处理机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springmvc错误处理机制是什么
2023-06-17

Go语言的错误处理方式

这篇文章主要介绍“Go语言的错误处理方式”,在日常操作中,相信很多人在Go语言的错误处理方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言的错误处理方式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-15

Golang错误处理方式异常与error

我们在使用Golang时,不可避免会遇到异常情况的处理,与Java、Python等语言不同的是,Go中并没有try...catch...这样的语句块,这个时候我们如何才能更好的处理异常呢?本文来教你正确方法
2023-01-14

Golang中的错误处理方式有哪些

这篇文章主要讲解了“Golang中的错误处理方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中的错误处理方式有哪些”吧!错误类型在Golang中,错误类型是错误处理的基本
2023-07-06

springMVC图片上传的处理方式详解

本文实例为大家分享了springMVC图片上传的处理方式,供大家参考,具体内容如下首先需要依赖的jar包:  commons-io  commons-io
2023-05-31

JavaScript中错误正确处理方式,你对了吗?

JavaScript的事件驱动范式增添了丰富的语言,也是让使用JavaScript编程变得更加多样化。如果将浏览器设想为JavaScript的事件驱动工具,那么当错误发生时,某个事件就会被抛出。理论上可以认为这些发生的错误只是JavaScr
2023-06-03

golang函数的错误处理模式

在 go 中处理函数错误的常见模式有:返回错误:函数返回错误值,成功时为 nil,失败时为 error 类型。全局变量:使用全局变量存储错误值,以便函数轻松访问和使用错误值。恐慌:当错误严重到函数无法继续运行时使用,立即终止函数并传播错误给
golang函数的错误处理模式
2024-05-04

springmvc url处理映射的三种方式集合

目录一、SpringMVC简介二、工作流程与介绍三、代码截图以下组件通常使用框架提供实现:1、DispatcherServlet:前端控制器2、HandlerMapping:处理器映射器3、Handler:处理器4、HandlAdapter:处理器适配器5、
2019-01-04

PHP7下载PDF文件出现错误的处理方式

PHP7下载PDF文件出现错误的处理方式在网站开发中,经常会有需要下载PDF文件的情况。但是有时候在使用PHP7下载PDF文件时会出现一些错误,比如下载的文件无法打开、下载的文件损坏等问题。本文将介绍在PHP7中下载PDF文件出现错误的处
PHP7下载PDF文件出现错误的处理方式
2024-02-29

SQL代理错误日志处理方法

这篇文章主要讲解了“SQL代理错误日志处理方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL代理错误日志处理方法”吧!SQL Server代理是所有实时数据库的核心。代理有很多不明显的
2023-06-20

flask中响应错误的处理及errorhandler的应用方式

这篇文章主要介绍了flask中响应错误的处理及errorhandler的应用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录