使用Springmvc @requestBody注解接收不到ajax的json数据,http 415错误

爱学习的小雷 发布于 2015/07/03 10:47
阅读 19K+
收藏 0
这是pom里面的spring版本号和JSON
<properties> 
  	<!-- spring版本号 --> 
	<spring.version>4.1.3.RELEASE</spring.version>
	<!-- mybatis版本号 -->
	<mybatis.version>3.2.6</mybatis.version>
	<!-- log4j日志文件管理包版本 -->
	<slf4j.version>1.7.7</slf4j.version>
	<log4j.version>1.2.17</log4j.version>	
  </properties>
<!-- 映入JSON -->
	<dependency>
	<groupId>org.codehaus.jackson</groupId>
	<artifactId>jackson-core-asl</artifactId>
	<version>1.9.13</version>
	</dependency>
	<dependency>
	<groupId>org.codehaus.jackson</groupId>
	<artifactId>jackson-mapper-asl</artifactId>
	<version>1.9.13</version>
	</dependency>

这是-servlet配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd  
                        http://www.springframework.org/schema/mvc  
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
	<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
	<import resource="classpath:spring-mybatis.xml" />
	<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
	<context:annotation-config />
	<mvc:annotation-driven />
	<!-- 自动扫描指定包下的内容 -->
	<context:component-scan base-package="com.zking.controller" />
	<context:component-scan base-package="com.zking.service"/>
	<context:component-scan base-package="com.zking.ajax"/>
	   
	<mvc:resources location="/WEB-INF/css/" mapping="/css/**" />  
	<mvc:resources location="/WEB-INF/img/" mapping="/img/**" />  
	 <!-- 文件上传解析器 id 必须为multipartResolver -->
  	 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    </bean> 
	<!-- 定义跳转的文件的前后缀 ,视图模式配置-->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	
		<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
		<property name="prefix" value="/WEB-INF/pages/" />
		<property name="suffix" value=".jsp" />
	</bean>

</beans>

这是jsp页面


<script type="text/javascript">
	$(function(){
		$('#click').click(function(){
			var person = JSON.stringify({name: "user1", age: "123"});  
			alert(person);  
			$.ajax({
				type : 'POST', 
				url  : '<c:url value='/ajaxTest'/>',
			   	contentType:'application/json; charset=UTF-8',
			    dataType:'json',
			    data : person,
			    success : function(obj) {
			    	if(obj.status == "success"){
			    		alert(obj.result);
			    	}else{
						alert(obj.result);	    		
			    	}
			    },
				error:function(){
			    	alert("错误。。");   
			    }
			});	
		});
	});
</script>

这是controller



@RequestMapping(value="/ajaxTest",method=RequestMethod.POST,produces="application/json; charset=UTF-8")
	public @ResponseBody JSONResponse ajax(@RequestBody Person person) {
		JSONResponse response =new JSONResponse();
		log.info("-------------进入ajaxTest---------------");
		log.info(person.getName()+person.getAge());
		response.setStatus("success");
		response.setResult("恭喜你,测试成功了!");
		return response;
	}

弄了好久,就是不知道为什么为报415错误,如果不写@requestBody注解,可以进入controller,但是取不到值啊

以下是问题补充:

@爱学习的小雷:java (2015/07/03 10:48)
加载中
0
爱学习的小雷

终于被我我解决了,在-servlet配置了

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

然后再添加一个jackson的jar包

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



就可以了,测试成功!




0
土豆NO-1
土豆NO-1
貌似要传一个json对象过去
爱学习的小雷
我试过了兄弟,一样还是415错误
0
涵小涵
涵小涵
看看你的Person中,属性的名和类型是不是一致,这个也是会发生415错误的原因
涵小涵
涵小涵
age的引号去掉,你js对象的age 他会认为是是字符串型的,entity里的int型,应该是不能转换
爱学习的小雷
private String name; private int age; 两个属性也是一样的
0
嘻哈开发者
嘻哈开发者
你需要配HttpMessageConverter协议-消息转换器,将json转成实体

爱学习的小雷
@嘻哈开发者 谢谢,我搞定了
爱学习的小雷
回复 @嘻哈开发者 : 请问怎么配置,到网上找了一些,但是一直启动报错,
嘻哈开发者
嘻哈开发者
回复 @雷衍清 : 自动加载只是说注解的bean交给spring管理,但从前端到后台的协议转换是要另外配置的,配置了spring才知道怎么转换
爱学习的小雷
不是说spring3.1以上只要配置<mvc:annotation-driven />就会自动加载吗
0
爱学习的小雷
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </mvc:message-converters>

</mvc:annotation-driven>

这样呢写会启动服务器的时候报错,不知道哪里有冲突

0
LucEsape
LucEsape
@RequestMapping(value="/ajaxTest",method=RequestMethod.POST)
LucEsape
LucEsape
回复 @爱学习的小雷 : 想返回json对象就用这个,返回为json字符串用你那个
爱学习的小雷
请问你想表达什么
返回顶部
顶部