目录

HttpMediaTypeNotAcceptableException报错解决,状态码显示为406

/weixin_miniapp.png

HttpMediaTypeNotAcceptableException报错解决,状态码显示为406

当返回类没有添加 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;
}

/weixin_miniapp.png