通过Postman调用Spring Boot接口出现Not Acceptable(406)错误求助
问题分析与解决
问题描述
我基于Spring Boot编写了如下接口代码:
@RestController @RequestMapping("/Home") public class HomeController { private final IHomeService homeService; @Autowired public HomeController(IHomeService homeService){ this.homeService = homeService; } @GetMapping("/hello") public @ResponseBody Emp hello() { return homeService.getEmp(); } }
期望通过Postman调用时返回JSON格式的对象,但收到如下错误响应:
{ "timestamp": "2024-04-30T11:39:23.093+00:00", "status": 406, "error": "Not Acceptable", "path": "/Home/hello" }
可能的原因及解决办法
1. 缺失JSON序列化依赖
Spring Boot默认依赖Jackson处理JSON序列化,而spring-boot-starter-web已经包含该依赖。检查项目依赖配置:
- Maven(
pom.xml):确保包含以下依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- Gradle(
build.gradle):确保包含以下依赖
implementation 'org.springframework.boot:spring-boot-starter-web'
若缺失则添加,之后重新构建项目。
2. Postman请求头Accept设置错误
406错误的核心原因是服务器无法生成客户端Accept头指定的响应格式。检查Postman请求:
- 将
Accept头设置为application/json - 或直接删除
Accept头,让服务器自动返回默认格式(通常为JSON)
3. Emp实体类存在序列化问题
Jackson序列化对象需要满足以下条件:
- 类必须有无参构造函数
- 私有字段必须提供对应的
getter方法,或用@JsonProperty注解标注字段
示例符合要求的Emp类:
public class Emp { private Long id; private String name; // 必须存在无参构造 public Emp() {} // 全参构造(可选) public Emp(Long id, String name) { this.id = id; this.name = name; } // 字段对应的getter方法 public Long getId() { return id; } public String getName() { return name; } // setter方法(按需添加) public void setId(Long id) { this.id = id; } public void setName(String name) { this.name = name; } }
4. 显式指定接口返回格式
在@GetMapping注解中通过produces属性明确指定返回JSON格式:
@GetMapping(value = "/hello", produces = MediaType.APPLICATION_JSON_VALUE) public Emp hello() { return homeService.getEmp(); }
注:@RestController注解已包含@ResponseBody功能,方法上的@ResponseBody可以省略。
内容的提问来源于stack exchange,提问作者OMM
相关产品推荐
相关产品推荐

