SpringMVC 内容协商处理

SpringMVC 内容协商是restful风格的体现,一般springmvc和前台数据交换有xml格式和json两种数据格式,平时我们主流使用的主要是json格式

我现在在pom.xml 文件中配置了两种解析工具,一个是json,一个是xml

但是返回的数据格式是xml,我想要json,

看看我的ajax请求:

javascript 复制代码
	function doLogin(){			
			let username=$("#username").val();
			let password=$("#password").val();
			let data={
				"username":username,
				"password":password
			}
			$.ajax({
			     type: "POST",
			     url: "/dologin4",
				 contentType: "application/json",
			     data: JSON.stringify(data),
			     success: function(res){
			    	 console.log(res)
					if(res.code==='success'){
						location.href="index";
					}else{
						alert(res.msg);
					}
					   
				 },
				 error: function(error){
					console.log(error);
				 },
			    
			});
			
		}

再看看我的Controller是这样的:

java 复制代码
	@ResponseBody
	@RequestMapping("dologin4")
	public Map<String,Object> dologin4(@Valid @RequestBody UserInfo userinfo,BindingResult br,HttpServletRequest request) {
		System.out.println("正在dologin4");
		
		String message="";
		
		 List<ObjectError> list=br.getAllErrors();
		 for(ObjectError oe:list) {
			System.out.println(oe.getDefaultMessage());
			
			message=message+oe.getDefaultMessage();
		 }
		 
		 
		 if(message!="" && message.length()>0) {
			    Map<String,Object> map=new HashMap<String, Object>();
				map.put("code","fail");
				map.put("msg",message);
				return map;
		 }
		 

		String username=userinfo.getUsername();
		String password=userinfo.getPassword();
		System.out.println(username);
		System.out.println(password);
		if("张三".contentEquals(username) && "123456".contentEquals(password)) {
			HttpSession session=request.getSession(true);
			session.setAttribute("username", username);
			Map<String,Object> map=new HashMap<String, Object>();
			map.put("code","success");
			map.put("msg","登陆成功");
			System.out.println("登录成功");
			return map;
		}else {
			Map<String,Object> map=new HashMap<String, Object>();
			map.put("code","fail");
			map.put("msg","登陆失败");
			System.out.println("登录失败");
			return map;
		}
		
	}
	

我看了一下HttpMessageConverter 发现是这样的:

是否和这个消息转换器中的顺序有关系,为什么xml的顺序在前面,是不是我pom.xml 中引入的顺序有问题,我们来看一下:

java 复制代码
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.13.0</version>
		</dependency>
         <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.13.4</version>
         </dependency>	
         <dependency>
             <groupId>jakarta.xml.bind</groupId>
             <artifactId>jakarta.xml.bind-api</artifactId>
             <version>4.0.0</version> <!-- 根据需要调整版本 -->
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-oxm</artifactId>
          <version>6.1.2</version> <!-- 使用与你Spring项目兼容的版本 -->
        </dependency>
       <dependency>
           <groupId>org.glassfish.jaxb</groupId>
           <artifactId>jaxb-runtime</artifactId>
           <version>4.0.3</version>
       </dependency>
    

我是把json放到了xml的依赖的前面,现在我调整一下顺序,但是并没有效果

在 Spring MVC 中,消息转换器默认顺序是由框架设计及加载机制决定的,原因如下:

  • 历史与兼容性 :早期 Spring MVC 版本确定了消息转换器的默认加载顺序,后续为保证兼容性,未做大幅改动。像ByteArrayHttpMessageConverter 等作为基础转换器,先加载以处理简单数据类型,为后续复杂类型转换打基础。
  • 约定优于配置原则:框架遵循约定优于配置,按常见应用场景设定默认顺序。例如,先处理字节数组、字符串等基础类型,再处理资源相关类型,最后处理复杂对象的 JSON、XML 转换 。这种顺序能满足多数项目的常规数据处理需求,减少开发者配置工作。
  • 依赖引入顺序影响:若项目引入新的消息转换器依赖,Maven 等构建工具按依赖声明顺序或依赖传递规则引入,会影响消息转换器在容器中的注册顺序。比如先声明了 XML 相关依赖,后声明 JSON 相关依赖,在某些情况下会导致 XML 转换器排在 JSON 转换器前。

如何强制改变顺序:

我修改了spring-servlet.xml 中的配置:

java 复制代码
	<!-- 启用 Spring MVC 注解驱动 -->
	<mvc:annotation-driven>
	    <mvc:message-converters>
           <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
           <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter"/>
        </mvc:message-converters>
	
	</mvc:annotation-driven>

再次调试:

这样前台就优先返回json格式的数据了

希望对你有所帮助

相关推荐
拾光拾趣录12 分钟前
for..in 和 Object.keys 的区别:从“遍历对象属性的坑”说起
前端·javascript
OpenTiny社区23 分钟前
把 SearchBox 塞进项目,搜索转化率怒涨 400%?
前端·vue.js·github
编程猪猪侠1 小时前
Tailwind CSS 自定义工具类与主题配置指南
前端·css
qhd吴飞1 小时前
mybatis 差异更新法
java·前端·mybatis
YGY Webgis糕手之路1 小时前
OpenLayers 快速入门(九)Extent 介绍
前端·经验分享·笔记·vue·web
患得患失9491 小时前
【前端】【vueDevTools】使用 vueDevTools 插件并修改默认打开编辑器
前端·编辑器
ReturnTrue8681 小时前
Vue路由状态持久化方案,优雅实现记住表单历史搜索记录!
前端·vue.js
UncleKyrie1 小时前
一个浏览器插件帮你查看Figma设计稿代码图片和转码
前端
遂心_1 小时前
深入解析前后端分离中的 /api 设计:从路由到代理的完整指南
前端·javascript·api
你听得到112 小时前
Flutter - 手搓一个日历组件,集成单日选择、日期范围选择、国际化、农历和节气显示
前端·flutter·架构