SpringMVC @ResponseBody 415错误处理方式

目录
  • 以下是我分析的解决步骤方法
    • 1、springMVC配置文件开启注解
    • 2、添加springMVC需要添加如下配置
    • 3、pom.xml添加jackson依赖
    • 4、ajax请求要求
    • 5、Controller 接收响应JSON

闲话少说,刚开始用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());
    }  

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

(0)

相关推荐

  • 解决@RequestBody接收json对象报错415的问题

    @RequestBody接收json对象报错415 前端请求: $.ajax({ url: basePath() + "/index/login.do", type : "post", data: JSON.stringify(form), dataType : "json", contentType : "application/json;charset=utf8", success: function (data) { c

  • SpringMVC中解决@ResponseBody注解返回中文乱码问题

    昨天在做项目的时候用@ResponseBody注解,发现返回页面上的中文是乱码,解决过程也是让我很郁闷!!!特此记录一些.目前有下面几种解决方案: @RequestMapping的produces方法 第一种解决方案是使用@RequestMapping注解的produces方法.写法如下: 复制代码 代码如下: @RequestMapping(value = "testPersonalValidtor.do",produces = "application/json;char

  • Springmvc 4.x利用@ResponseBody返回Json数据的方法

    下面是官方文档对于@ResponseBody注解的解释: Mapping the response body with the @ResponseBody annotation The @ResponseBody annotation is similar to @RequestBody. This annotation can be put on a method and indicates that the return type should be written straight to

  • 解决使用@ResponseBody后返回500错误的问题

    在springmvc+mybatis的项目中,利用mybatis分页插件mybatis-paginator进行分页查询,结果出现了500异常,后端又没有明显的报错. 原来的写法,返回Map对象,由springmvc里面的机制转为json对象,这样就会导致,在转json过程中的报错,都隐藏了,无法抛出,前端获取不到正确的数据, 最后就出现了500的异常. @RequestMapping(value = "/query") @ResponseBody public Map<Strin

  • SpringMVC @ResponseBody 415错误处理方式

    目录 以下是我分析的解决步骤方法 1.springMVC配置文件开启注解 2.添加springMVC需要添加如下配置 3.pom.xml添加jackson依赖 4.ajax请求要求 5.Controller 接收响应JSON 闲话少说,刚开始用SpringMVC, 页面要使用jquery的ajax请求Controller. 但总是失败, 主要表现为以下两个异常为: 异常一:java.lang.ClassNotFoundException: org.springframework.http.con

  • HTTP 415错误-Unsupported media type详解

       前段时间在使用@RequestBody注解的时候遇到了一个以前没遇到过的错误,HTTP 415  Unsupported media type? 这个是个什么鬼,@ResponseBody可以正常工作而一使用@RequestBody来进行交互就会报这个错误.一直请求不到Controller,我开始总以为是路径或者json格式不对的问题,上网查资料大多也说的是这个问题.可是我已经写了 data : JSON.stringify(user),   dataType : 'json', cont

  • Ajax向后台传json格式的数据出现415错误的原因分析及解决方法

    问题描述: ajax往后台传json格式数据报415错误,如下图所示 页面代码 function saveUser(){ var uuId = document.getElementById("uuid").value; var idCard = document.getElementById("idCard").value; alert(uuId+idCard); // var result = new Object(); // result.uuId = uuI

  • springMvc 前端用json的方式向后台传递对象数组方法

    如下所示: JSP var vipFee= new Array; //遍历选中的对象 $("#feeList :checkbox:checked").each(function(i){ vipFee.push({"enterpriseSeq":$(this).attr("enterpriseSeq"),"merchNo":$(this).val(),"serviceFee":$(this).attr(&qu

  • springmvc json类型转换错误解决方案

    这篇文章主要介绍了springmvc json类型转换错误解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在用springmvc做json数据时,返回时,提示类型转换错误 如下, org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentExcep

  • [Spring MVC]-详解SpringMVC的各种参数绑定方式

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似): Controller代码: @RequestMapping("saysth.do") public void test(int count) { } 表单代码: <form action="saysth.do" method="post"> <input name="count" value="10" t

  • laravel接管Dingo-api和默认的错误处理方式

    接管Dingo-api的错误 如上图所示,AppServiceProvider.php中的register()方法中添加如下代码 \API::error(function (\Illuminate\Validation\ValidationException $exception){ $data =$exception->validator->getMessageBag(); $msg = collect($data)->first(); if(is_array($msg)){ $msg

  • http post 415错误的解决方法

    前面在spring boot项目中,进行前后端数据交互时突然遇到了415错误.一时间有点懵,在网上找了一些资料,总算是知道为什么了,不多说,直接上图. 这是正常的form提交的数据. debug之后能够服务器能够正常的接收数据. 当请求数据的格式变成json时, 此时debug之后发现并没有数据传入. 并且还报出了Resolved exception caused by Handler execution: org.springframework.web.HttpMediaTypeNotSupp

  • JavaScript中async await更优雅的错误处理方式

    目录 背景 为什么要错误处理 async await 更优雅的错误处理 小结 总结 背景 团队来了新的小伙伴,发现我们的团队代码规范中,要给 async  await 添加 try...catch.他感觉很疑惑,假如有很多个(不集中),那不是要加很多个地方?那不是很不优雅? 为什么要错误处理 JavaScript 是一个单线程的语言,假如不加 try ...catch ,会导致直接报错无法继续执行.当然不意味着你代码中一定要用 try...catch 包住,使用 try...catch 意味着你

  • 详解SpringMVC的两种实现方式

    目录 一.方法一:实现Controller接口 二.方法二:使用注解开发 一.方法一:实现Controller接口 这个在我的第一个SpringMVC程序中已经学习过了,在此不作赘述,现在主要来学习第二种方法,使用注解开发: 二.方法二:使用注解开发 1.导包 2.在web.xml中配置DispatcherServlet 3.建立一个Spring配置文件springmvc-servlet.xml <?xml version="1.0" encoding="UTF-8&q

随机推荐