如何向Java Bean类添加非属性字段?解决logger字段运行时异常
解决Bean属性"logger"不可读的异常
问题根源
你碰到的异常和Jackson序列化无关(所以@JsonIgnore无效),是JavaBean属性检测机制(比如Spring的Bean数据绑定、ORM框架的属性扫描)把static final的logger字段误判成了普通Bean属性,但该字段没有配套的getter/setter方法,因此抛出错误。
可行解决方案
1. 用@Transient标记logger字段
@Transient是JavaEE标准注解,专门用来标记不需要被框架当作Bean属性扫描/持久化的字段,能直接让框架忽略这个字段的属性检测:
@JsonIgnoreProperties(ignoreUnknown = true) public class Foo { @Transient private static final Logger logger = LoggerFactory.getLogger(Foo.class); @JsonProperty("initialSize") private String initialSize; @JsonProperty("logAbandoned") private String logAbandoned; @JsonProperty("maxActive") private String maxActive; // 其他字段、getter/setter方法... }
2. 改用静态内部类持有logger(进阶方案)
如果担心静态字段的初始化顺序问题,或者想彻底避免被属性扫描机制识别,可以用静态内部类实现logger的懒加载:
@JsonIgnoreProperties(ignoreUnknown = true) public class Foo { private static class LoggerHolder { private static final Logger logger = LoggerFactory.getLogger(Foo.class); } // 业务方法中调用日志对象 public void someBusinessMethod() { LoggerHolder.logger.info("执行业务逻辑"); } // 其他字段、getter/setter方法... }
3. 调整访问修饰符(不推荐)
如果不想加注解,也可以把logger的访问修饰符改为protected或public,但这种做法会破坏封装性,不建议使用。
为什么@JsonIgnore不起作用?
@JsonIgnore是Jackson专属注解,只负责控制JSON序列化/反序列化的字段忽略逻辑,而你遇到的异常是Bean属性访问器(比如Spring的BeanWrapper)在扫描Bean属性时抛出的,属于完全不同的处理流程,所以@JsonIgnore无法解决这个问题。
内容的提问来源于stack exchange,提问作者Mikhail T.
相关产品推荐
相关产品推荐

