如何在外部类上加载@ConfigurationProperties?

Posted

技术标签:

【中文标题】如何在外部类上加载@ConfigurationProperties?【英文标题】:How to load @ConfigurationProperties on external class? 【发布时间】:2018-07-08 05:37:39 【问题描述】:

如果 bean 类来自外部库(例如我自己的公共库),我如何使用 @ConfigurationProperties 填充该 bean?

示例:来自公共库:

package com.my.commons.person;

import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotNull;

@Validated
public class CommonPerson 
    private @NotNull String name;
    private @NotNull String age;

    public String getName()  return name; 
    public void setName(String name)  this.name = name; 
    public String getAge()  return age; 
    public void setAge(String age)  this.age = age; 

实施项目:

package com.my.api;

@SpringBootApplication
public class MainApp extends SpringBootServletInitializer 
    @Bean
    @ConfigurationProperties("commons.person")
    public CommonPerson person() 
        return new CommonPerson();
    

application.properties(也只在实现项目中):

commons.person.name=Dummy
commons.person.age=30

结果:

由于验证异常,应用程序启动失败。 o.s.b.b.PropertiesConfigurationFactory:对象中的字段错误 字段“名称”上的“commons.person”:拒绝值 [null]...

顺便说一句:如果我将CommonPerson 直接移动到实现项目中,代码将按预期工作。只有当课程来自外部时,它才不起作用......

根据文档,这应该可以工作: @ConfigurationProperties on thirdparty classes

我正在使用 maven 加载我的 commons 包:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath/>
</parent>
<dependencies>
    <dependency>
        <groupId>com.my.commons</groupId>
        <artifactId>person-commons</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

【问题讨论】:

你有这些字段的设置者吗? 将 getter 和 setter 添加到您的 CommonPerson @davidxxx 该死! :D 别再快了! ;) @Yannic Klem heyhey :) 这是一个库类。他/她做不到。 不,现在很好。但一切似乎都很好。该错误可能是由您的代码/配置中的某些内容引起的可怕副作用。我建议您要么隔离问题以了解根源,要么使用调试器逐步调试 Spring 处理。 【参考方案1】:

正如@davidxxx 和其他人所指出的,代码本身是正确的。

我的问题可能是 IDE 的一些缓存问题。我刚刚取出pom.xml 中的commons 库,保存并阅读。这以某种方式触发了 IDE 内部的清理,而 mvn clean install 没有(因为我之前多次运行这些 maven 目标)。

【讨论】:

【参考方案2】:

尝试使用...@EnableConfigurationProperties 注解启用配置属性支持,这可能会有所帮助。

一些例子和用法说明: 1 和 2

【讨论】:

以上是关于如何在外部类上加载@ConfigurationProperties?的主要内容,如果未能解决你的问题,请参考以下文章

在外部类中使用类模板时如何定义内部类构造函数?

ActionScript 3 - 在外部类中使用 MovieClip

java学习之内部类

内部类中的私有构造函数在外部类中初始化

内部类包修饰符代码块

java基础之内部类