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格式的数据了

希望对你有所帮助

相关推荐
某公司摸鱼前端9 分钟前
uniapp socket 封装 (可拿去直接用)
前端·javascript·websocket·uni-app
要加油哦~10 分钟前
vue | 插件 | 移动文件的插件 —— move-file-cli 插件 的安装与使用
前端·javascript·vue.js
小林学习编程16 分钟前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
柳鲲鹏17 分钟前
WINDOWS最快布署WEB服务器:apache2
服务器·前端·windows
weixin-a153003083161 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
ai小鬼头2 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
一只叫煤球的猫2 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
vvilkim3 小时前
Electron 自动更新机制详解:实现无缝应用升级
前端·javascript·electron
vvilkim3 小时前
Electron 应用中的内容安全策略 (CSP) 全面指南
前端·javascript·electron
aha-凯心3 小时前
vben 之 axios 封装
前端·javascript·学习