一. 异常描述
最近大连九哥有一个学生,在做项目时碰到了一个“奇怪”的问题,他发现当他在浏览器地址栏中输入接口的url地址后,浏览器中返回的响应内容不是json格式,而是xml格式,这个问题困扰了他一个下午。
二. 案例代码
这个问题其实也是Springboot面试时的常见问题,即Springboot对于响应结果的“仲裁机制”。
为了可以让大家能够详细的了解这个异常的产生原因,九哥给大家编写一个简单的案例来还原一下上述问题,并探讨Springboot响应结果的仲裁机制是怎么回事。
1.pom.xml文件
4.0.0 org.springframework.boot spring-boot-starter-parent2.6.6 com.example demo10.0.1-SNAPSHOT demo1 Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-weborg.projectlombok lombokcom.fasterxml.jackson.dataformat jackson-dataformat-xmlorg.springframework.boot spring-boot-maven-plugin
2.User类
package com.example.demo1;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
}
3.Demo1Application类
package com.example.demo1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@SpringBootApplication
@Controller
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
@RequestMapping("/hello")
@ResponseBody
public User test1(){
return new User(1,"lisi");
}
}
三. 异常重现
1.开启日志功能
代码编写完毕之后,我们可以先打开springboot的debug日志功能,如下所示:
debug=true
2.访问接口地址
接下来我们就开始访问接口地址,当访问接口时会返回如下内容,这里果然是使用xml格式作为响应格式的,why?
2022-04-03 10:10:56.564 DEBUG 15072 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : GET "/hello", parameters={}
2022-04-03 10:10:56.564 DEBUG 15072 --- [nio-8080-exec-8] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.example.demo1.Demo1Application#test1()
2022-04-03 10:10:56.565 DEBUG 15072 --- [nio-8080-exec-8] m.m.a.RequestResponseBodyMethodProcessor : Using 'application/xhtml+xml', given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.9, **;q=0.8]
# springboot可以支持的响应格式
and supported [application/json, application*;q=0.8] and supported [application/json]
2022-04-03 11:03:35.428 DEBUG 7540 --- [nio-8080-exec-4] m.m.a.RequestResponseBodyMethodProcessor : Writing [User(id=1, name=lisi)]
2022-04-03 11:03:35.438 DEBUG 7540 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed 200 OK
2.前端解决--请求时明确想要的输出格式
另外我们其实也可以在前端发起request请求时,由请求发送方明确指定自己想要接受的响应类型,例如通过发送ajax请求,可以指定接受服务器端返回的json类型数据。
var xhr = new XMLHttpRequest();
xhr.open('get','/hello');
xhr.setRequestHeader('Accept','application/json');
xhr.send();
此时同样可以得到json格式的响应信息。
以后如果你也遇到了同样的问题,知道该怎么解决了吧?
*威哥Java学习交流Q群:691533824
加群备注:CSDN推荐



