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

发布于:2025-03-12 ⋅ 阅读:(23) ⋅ 点赞:(0)

当返回类没有添加 gettersetter 方法时出现 HTTP 406 错误(Not Acceptable),主要与 Spring 框架处理响应数据的机制以及消息转换器的工作原理有关
(注意前提,你已经添加了json相关库的依赖)

消息转换器的工作原理

在 Spring 框架中,当控制器方法返回一个对象时,Spring 会使用消息转换器(Message Converter)将该对象转换为客户端可接受的媒体类型(如 JSON、XML 等)。以常见的 JSON 格式为例,Spring 通常使用 Jackson 库来完成对象到 JSON 的转换。

缺少 gettersetter 方法导致的问题

1. 对象属性无法访问

Jackson 在将 Java 对象转换为 JSON 字符串时,依赖于对象的 getter 方法来获取对象的属性值。如果返回类没有提供 getter 方法,Jackson 就无法访问对象的属性,也就无法将这些属性转换为 JSON 格式的键值对。

例如,有一个简单的 User 类:

public class User {
    private String name;
    private int age;
    // 没有提供 getter 和 setter 方法
}

当控制器方法返回 User 对象时,Jackson 无法获取 nameage 属性的值,就无法生成有效的 JSON 响应。

2. 消息转换器无法处理

由于消息转换器无法将对象正确转换为客户端期望的媒体类型,服务器就无法提供符合客户端 Accept 头要求的响应。客户端请求的媒体类型(如 application/json)在服务器端无法得到正确的表示,从而触发 HttpMediaTypeNotAcceptableException 异常,返回 HTTP 406 错误。

解决办法

为返回类添加 gettersetter 方法,以便消息转换器能够正常访问和处理对象的属性。修改后的 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 注解来自动生成 gettersetter 方法,简化代码:

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private String name;
    private int age;
}