You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot实体无getter/setter返回406错误问题咨询

问题根因说明

Spring Boot 中@RestController标注的接口,默认使用内置的Jackson组件完成返回对象到JSON的序列化工作,整个序列化流程遵循Jackson的默认访问规则:

  • 默认情况下,Jackson只会扫描类的public修饰的getter方法作为JSON属性的取值来源,不会直接读取非public修饰的成员变量。
  • 示例中的UserDetails类里,userid和username两个属性都是包级访问权限(无访问修饰符),且类中没有提供public的getter方法,Jackson扫描该类时找不到任何可序列化的属性,无法生成符合要求的JSON响应体,因此抛出HttpMediaTypeNotAcceptableException异常,最终返回406 Not Acceptable状态码。
  • 为实体类补充public的getter方法后,Jackson可以通过getUserid()、getUsername()方法获取到两个属性的值,即可正常完成JSON序列化,返回预期的响应结构。
相关代码示例

异常场景的实体类代码

package com.example.VideoVerification.request;

public class UserDetails {
    String userid;
    String username;

    public UserDetails(String userid, String username)
    {
        this.username = username;
        this.userid = userid;
    }
    // 未编写public修饰的getter/setter方法
}

接口代码

package com.example.VideoVerification.controller;

import com.example.VideoVerification.request.UserDetails;
import org.springframework.web.bind.annotation.*;

@RestController
public class APIController
{
    @PostMapping(value = "/getUserDetails")
    public UserDetails getUserDetails()
    {
       return new UserDetails("1111","Tom");
    }
}

异常响应

{
    "timestamp": "2022-06-03T16:46:14.562+00:00",
    "status": 406,
    "error": "Not Acceptable",
    "path": "/getUserDetails"
}

控制台异常信息:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

正常响应(补充getter后)

{
    "userid": "1111",
    "username": "Tom"
}
不写getter/setter的替代方案

如果不想手动编写getter/setter方法,可以选择以下两种方案实现正常序列化:

  • 方案1:配置Jackson的字段可见性,在实体类上添加@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)注解,让Jackson直接读取类的所有成员变量,无需依赖getter方法:
package com.example.VideoVerification.request;
import com.fasterxml.jackson.annotation.JsonAutoDetect;

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class UserDetails {
    String userid;
    String username;

    public UserDetails(String userid, String username)
    {
        this.username = username;
        this.userid = userid;
    }
}
  • 方案2:引入Lombok依赖,在实体类上添加@Data注解,由Lombok在编译期自动生成getter/setter、toString等通用方法,无需手动编码。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:45:39