码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Spring Boot配置项注入异常:Failed to bind properties


    从日志来看,配置项存在,也排除了拼写错误,但是启动工程时抛Failed to bind properties错误。

    Reason: Failed to bind properties under 'module-name.search-service' to a.b.SearchServiceProperties$$EnhancerBySpringCGLIB$$fd93c720
    
    • 1

    跟了源码,发现在JavaBeanBinder里的方法, 实现从property到bean的绑定(也就是给property赋值)。

    private  boolean bind(BeanSupplier beanSupplier, DataObjectPropertyBinder propertyBinder,
    			BeanProperty property) {
    	String propertyName = property.getName();
    	ResolvableType type = property.getType();
    	Supplier value = property.getValue(beanSupplier);
    	Annotation[] annotations = property.getAnnotations();
    	Object bound = propertyBinder.bindProperty(propertyName,
    			Bindable.of(type).withSuppliedValue(value).withAnnotations(annotations));
    	if (bound == null) {
    		return false;
    	}
    	if (property.isSettable()) {
    		property.setValue(beanSupplier, bound);
    	}
    	else if (value == null || !bound.equals(value.get())) {
    		throw new IllegalStateException("No setter found for property: " + property.getName());
    	}
    	return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    下面方法的bean.getProperties的值对应的是setter方法,而非属性。

    private  boolean bind(DataObjectPropertyBinder propertyBinder, Bean bean, BeanSupplier beanSupplier,
    		Context context) {
    	boolean bound = false;
    	for (BeanProperty beanProperty : bean.getProperties().values()) {
    		bound |= bind(beanSupplier, propertyBinder, beanProperty);
    		context.clearConfigurationProperty();
    	}
    	return bound;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    因此,如果有setter方法,但是没有对应的属性,在ResolvableType里会是Void,而Void类型是不知道该怎么映射的,所以会报IllegalArgument的错误。这个错误被捕获,重新包装成ConfigurationPropertiesBindException抛出。于是就看到了上面的错误。

    具体到这次的坑,就是下面的方法,isValid,被认为是有一个valid配置,因为方法没有属性,所以对应到Void。

    @Configuration
    @ConfigurationProperties(prefix = "module-name.search-service")
    @Data
    @RefreshScope
    @Slf4j
    public class SearchServiceProperties {
      void isValid() { }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    解决方法是:

    1. 所有的Setter方法都必须有参数
    2. 如果想要定义方法,要避免使用setter的名字,比如isXXX或者setXXX
      因此改成这样就可以了:
    public class SearchServiceProperties {
      void isValid(Boolean valid) { }
      void check() {}
    }
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    什么是网关?网关有什么作用?
    Go 代码审计高危漏洞(sqli\cmd\ssrf)
    LeetCode——Weekly Contest 319
    第三十五章 Objects - 集合类
    RISCV汇编指令
    GitKraken Pro安装
    5. Linux-riscv内存管理21-24问
    python opencv遍历每一个像素点
    消息队列Kafka(一)介绍及安装以及基本原理
    分布式系列分布式计算框架Hadoop核心组件概述
  • 原文地址:https://blog.csdn.net/kakadiablo/article/details/128095647
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号