当返回类没有添加 getter
和 setter
方法时出现 HTTP 406 错误(Not Acceptable),主要与 Spring 框架处理响应数据的机制以及消息转换器的工作原理有关
(注意前提,你已经添加了json相关库的依赖)
消息转换器的工作原理
在 Spring 框架中,当控制器方法返回一个对象时,Spring 会使用消息转换器(Message Converter)将该对象转换为客户端可接受的媒体类型(如 JSON、XML 等)。以常见的 JSON 格式为例,Spring 通常使用 Jackson 库来完成对象到 JSON 的转换。
缺少 getter
和 setter
方法导致的问题
1. 对象属性无法访问
Jackson 在将 Java 对象转换为 JSON 字符串时,依赖于对象的 getter
方法来获取对象的属性值。如果返回类没有提供 getter
方法,Jackson 就无法访问对象的属性,也就无法将这些属性转换为 JSON 格式的键值对。
例如,有一个简单的 User
类:
public class User {private String name;private int age;// 没有提供 getter 和 setter 方法
}
当控制器方法返回 User
对象时,Jackson 无法获取 name
和 age
属性的值,就无法生成有效的 JSON 响应。
2. 消息转换器无法处理
由于消息转换器无法将对象正确转换为客户端期望的媒体类型,服务器就无法提供符合客户端 Accept
头要求的响应。客户端请求的媒体类型(如 application/json
)在服务器端无法得到正确的表示,从而触发 HttpMediaTypeNotAcceptableException
异常,返回 HTTP 406 错误。
解决办法
为返回类添加 getter
和 setter
方法,以便消息转换器能够正常访问和处理对象的属性。修改后的 User
类如下:
public class User {private String name;private int age;// 提供 getter 方法public String getName() {return name;}public int getAge() {return age;}// 提供 setter 方法public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
}
这样,当控制器方法返回 User
对象时,Jackson 可以通过 getter
方法获取属性值,并将其转换为 JSON 格式的响应,避免了 HTTP 406 错误。
此外,如果你使用的是 Lombok 库,可以通过添加 @Getter
和 @Setter
注解来自动生成 getter
和 setter
方法,简化代码:
import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class User {private String name;private int age;
}