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

Spring Boot中Bean未显式调用getter/setter,移除后控制器为何失效?

问题解答

核心原因:JSON序列化依赖Getter方法

你的控制器返回Student对象时,Spring Boot会自动把这个对象转成JSON响应给前端——这个转换工作是**Jackson(Spring默认的JSON处理库)**做的,而Jackson默认是通过调用对象的Getter方法来读取私有属性值,进而生成JSON的。

你代码里没显式调用Getter,但Spring后台的消息转换机制偷偷干了这事:

  • 带@RestController的方法返回对象时,Spring会触发HttpMessageConverter的处理流程
  • 默认用MappingJackson2HttpMessageConverter,它靠Jackson来序列化对象
  • Jackson默认认Getter方法当属性的访问入口,没有Getter的话,它读不到私有属性的值,自然生成不了正确的JSON,程序就会异常

验证&替代方案

验证方式

移除Getter后看控制台,大概率会出现com.fasterxml.jackson.databind.exc.InvalidDefinitionException,提示无法序列化Student类,找不到属性的访问方法。

不想写Getter的解决办法

有几种可选方案:

  • 把属性改成public(不推荐,破坏封装性)
  • 在Student类上加@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)注解,让Jackson直接读取私有字段,不需要Getter:
    import com.fasterxml.jackson.annotation.JsonAutoDetect;
    
    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
    public class Student {
        private int id;
        private String firstName;
        private String lastName;
    
        public Student(int id, String firstName, String lastName) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }
        // 无需编写Getter/Setter
    }
    
  • 使用Lombok的@Data注解,自动生成Getter、Setter等样板代码:
    import lombok.Data;
    
    @Data
    public class Student {
        private int id;
        private String firstName;
        private String lastName;
    
        public Student(int id, String firstName, String lastName) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }
    }
    

额外说明

其实Setter在你这个场景里不是必须的——你是通过构造方法初始化对象,而且是GET请求返回数据,单独删掉Setter程序照样能正常运行。真正必须的是Getter,而非Setter。

内容的提问来源于stack exchange,提问作者Gurjas Singh Sahney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:57:32