Spring注解@Value数值取值转换字符串失败

本文介绍如何在YAML配置文件中正确配置字符串类型的值,特别是当字符串包含数字且需要保持其原始形式而不被解析为数值的情况。通过使用引号包裹字符串可以避免类型转换问题。

配置文件(yml)中,配置项如下:

cebconfig:
    INST_CODE: 08801001
    SFT_NOTIFY_CEB_CHANNEL: 123456

 

期望INST_CODE: 08801001 作为字符串处理

代码:

    /**
     * 机构号(XX提供,从配置中读取并初始化)
     */
    public static String INST_CODE;

结果,获取的值被变为数值类型:

<InstID>8801001.0</InstID>

处理:

字符串默认不使用引号表示:    --- str: 这是一行字符串

如果字符串之中包含空格或特殊字符,需要放在引号之中:   --- str: '内容: 字符串'

单引号和双引号都可以使用,双引号不会对特殊字符转义:   

s1: '内容\n字符串'            --->s1: '内容\\n字符串'
s2: "内容\n字符串"            --->s2: '内容\n字符串' 

 

修改后:

cebconfig:
    INST_CODE: '0880SFT0'
    SFT_NOTIFY_CEB_CHANNEL: 123456

 

搞定!

 

参考:

http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt

 

转载于:https://www.cnblogs.com/huahua035/p/8532136.html

<think>我们正在讨论Spring框架中的@Value注解无法取值的问题。根据提供的引用内容,我们可以总结一些常见错误及解决方法。引用[1]展示了@Value的基本用法,包括设置默认值。引用[2]展示了在SpringBoot中使用@Value的示例。引用[3]展示了一个Controller中通过@Resource注Person对象,而Person对象可能使用了@Value属性。常见错误及解决方案:1.配置属性未定义且无默认值:-错误:当使用@Value("${property.name}")时,如果配置文件中没有定义该属性,且没有设置默认值,会抛出异常。-解决:设置默认值,如@Value("${property.name:defaultValue}")。2.配置属性拼写错误:-错误:配置文件中的属性名与@Value中引用的属性名不一致(大小写、拼写错误)。-解决:检查并确保拼写一致,注意SpringBoot的宽松绑定规则(如使用连字符或驼峰命名)。3.配置文件未加载:-错误:配置文件(如application.properties或application.yml)未被正确加载,导致属性不存在。-解决:确保配置文件在classpath下,且命名正确。对于SpringBoot,默认加载application.properties。4.使用环境:-错误:在非Spring管理的Bean中使用@Value(如普通Java类),因为@Value需要依赖注。-解决:确保使用@Value的类是由Spring容器管理的(例如,使用@Component,@Service,@Configuration等注解)。5.静态变量注:-错误:尝试将@Value用于静态变量,Spring不支持直接注静态变量。-解决:通过setter方法注到非静态变量,再赋值给静态变量(不推荐,因为破坏IOC),或者使用其他方式(如Environment对象)。6.未启用属性解析:-错误:在配置类中未启用属性解析(如未使用@PropertySource或未启用配置)。-解决:使用@PropertySource指定自定义配置文件,或确保SpringBoot的自动配置已启用(默认启用)。7.占位符解析器未配置:-错误:在非SpringBoot项目中,如果没有配置PropertySourcesPlaceholderConfigurer,则无法解析占位符。-解决:在配置类中定义一个PropertySourcesPlaceholderConfigurer的Bean。在SpringBoot中,此配置自动完成。8.作用域问题:-错误:在原型作用域的Bean中,如果属性是动态的,可能在每次获取Bean时都需要重新解析,但@Value只会在初始化时解析一次。-解决:对于动态属性,考虑使用Environment.getProperty()方法。9.YAML文件格式错误:-错误:如果使用YAML配置文件,格式错误可能导致属性未加载。-解决:检查YAML格式,确保缩进正确,属性名与值正确。10.多个配置文件冲突:-错误:多个配置文件中存在同名属性,可能未按预期覆盖。-解决:检查配置文件的加载顺序,SpringBoot中按特定顺序加载(如application-{profile}.properties),属性覆盖遵循规则。11.属性值类型不匹配:-错误:配置文件中的属性值无法转换为目标类型(例如,将字符串到整数属性)。-解决:确保属性值可以转换为目标类型,或使用转换器。12.在Bean初始化过程中使用属性值:-错误:在@PostConstruct方法中使用通过@Value的属性,但注尚未完成。-注意:实际上,依赖注在构造器和初始化方法之前完成,所以此问题较少,但如果属性注失败,则@PostConstruct中会报错。另外,如果遇到难以解决的问题,可以考虑使用Environment对象直接获取属性。下面给出一个示例,展示如何配置PropertySourcesPlaceholderConfigurer(在非SpringBoot项目中):```java@ConfigurationpublicclassAppConfig{@BeanpublicstaticPropertySourcesPlaceholderConfigurerpropertySourcesPlaceholderConfigurer(){returnnewPropertySourcesPlaceholderConfigurer();}}```在SpringBoot项目中,通常无需配置,因为自动配置已经处理。如果上述情况都排查了,仍然无法解决,可以尝试:-增加日志级别(如DEBUG)查看属性加载情况。-使用Environment的getProperty方法在代码中获取属性值,以确认属性是否存在于环境中。通过以上步骤,大部分@Value问题可以解决。§§相关问题§§1.如何在SpringBoot中自定义属性源?2.使用@Value注解数组或列表类型的属性?3.@Value和@ConfigurationProperties有什么区别?</think> ### Spring @Value 注解无法取值的常见错误及解决方法 以下是@Value注解无法取值的常见原因和解决方案,基于Spring的核心机制: #### 1. **配置文件未正确加载** **错误现象**:`@Value`注结果为`null`或抛`IllegalArgumentException` **原因**: - 配置文件(如`application.properties`)未在classpath中 - 未启用配置扫描(如缺少`@PropertySource`) **解决**: ```java // 显式指定配置文件路径 @Configuration @PropertySource("classpath:custom.properties") public class AppConfig { ... } ``` ✔️ 确认文件路径正确,Spring Boot默认加载`application.properties`[^2] #### 2. **属性名拼写错误** **错误现象**:注失败且日志提示`Could not resolve placeholder` **原因**: - 配置文件中的key与`@Value`中的占位符不一致 - 大小写不匹配(Spring默认区分大小写) **解决**: ```java // 确保完全匹配(包括连字符/下划线) @Value("${app.title}") // ← 需与配置文件中的"app.title"一致 private String title; ``` 🔍 使用`Environment`接口验证属性是否存在: ```java context.getEnvironment().getProperty("app.title"); ``` #### 3. **未设置默认值(关键错误)** **错误现象**:抛`IllegalArgumentException: Could not resolve placeholder` **原因**:当属性未定义时缺乏兜底机制 **解决**:添加默认值语法 ```java // 使用冒号分隔符设置默认值 @Value("${app.version:1.0.0}") private String version; ``` #### 4. **静态变量/非Spring管理类注** **错误现象**:静态字段注始终为`null` **原因**:Spring依赖注基于对象实例 **解决**:改用实例变量+setter注 ```java private static String title; @Value("${app.title}") public void setTitle(String val) { this.title = val; } ``` #### 5. **类型不匹配** **错误现象**:数值类型注失败并抛类型转换异常 **原因**:将非数字值注`int`/`long`字段 **解决**: ```java // 配置文件 server.port=8080 // ← 必须为整数 // 正确类型声明 @Value("${server.port}") private int port; // 不能用String接收数值 ``` #### 6. **SpEL表达式错误** **错误现象**:抛`SpelEvaluationException` **原因**:`#{}`与`${}`混淆使用 **解决**区分语法: ```java @Value("#{systemProperties['user.name']}") // SpEL表达式 private String systemUser; @Value("${user.name}") // 属性占位符 private String configUser; ``` #### 7. **Bean初始化顺序问题** **错误现象**:在构造函数中使用注值结果为`null` **原因**:依赖注发生在对象构造之后 **解决**:在`@PostConstruct`方法中使用注值 ```java @Value("${app.timeout}") private Integer timeout; @PostConstruct public void init() { System.out.println(timeout); // 此处值已注 } ``` #### 8. **环境覆盖问题** **错误现象**:测试环境正常但生产环境失败 **原因**:多环境配置文件冲突(如`application-prod.properties`未生效) **解决**:激活指定Profile ```bash # 启动命令添加java -jar app.jar --spring.profiles.active=prod ``` ### 诊断工具 1. **检查所有属性源**: ```java context.getEnvironment().getPropertySources().forEach(System.out::println); ``` 2. **开启调试日志**: `application.properties`中添加: ``` logging.level.org.springframework.context=DEBUG ``` ### 典型解决方案流程图 ```mermaid graph TD A[@Value失败] --> B{配置文件加载?} B -- 否 --> C[添加@PropertySource] B -- 是 --> D{属性名正确?} D -- 否 --> E[修正占位符命名] D -- 是 --> F{是否静态字段?} F -- 是 --> G[改用setter注] F -- 否 --> H{有无默认值?} H -- 否 --> I[添加 :defaultValue] H -- 是 --> J[检查类型匹配] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值