Java 多个属性返回空的Spring@ConfigurationProperties

Java 多个属性返回空的Spring@ConfigurationProperties,java,spring,Java,Spring,application.properties文件包含具有子属性的属性: status.available=00, STATUS.ALLOWED status.forbidden=01, STATUS.FORBIDDEN status.authdenied=05, STATUS.AUTH_DENIED @ConfigurationProperties(prefix = "status") public class StatusProperties { private

application.properties文件包含具有子属性的属性:

status.available=00, STATUS.ALLOWED
status.forbidden=01, STATUS.FORBIDDEN
status.authdenied=05, STATUS.AUTH_DENIED
@ConfigurationProperties(prefix = "status")
public class StatusProperties {

    private Map.Entry<Integer, String> available;
    private Map.Entry<Integer, String> forbidden;
    private Map.Entry<Integer, String> authdenied;

    public Map.Entry<Integer, String> getAvailable() {
        return available;
    }

    public void setAvailable(Map.Entry<Integer, String> available) {
        this.available = available;
    }

    public Map.Entry<Integer, String> getForbidden() {
        return forbidden;
    }

    public void setForbidden(Map.Entry<Integer, String> forbidden) {
        this.forbidden = forbidden;
    }

    public Map.Entry<Integer, String> getAuthdenied() {
        return authdenied;
    }

    public void setAuthdenied(Map.Entry<Integer, String> authdenied) {
        this.authdenied = authdenied;
    }
}
这样做的目的是将这些属性输入到应用程序中:

@Configuration
@ConfigurationProperties(prefix = "status")
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE)
public class StatusProperties {

    private Map <String, List <String>> statusMapping;

    public Map <String, List <String>> getStatusMapping () {
        return statusMapping;
    }

    public void setStatusMapping (Map <String, List <String>> statusMapping) {
        this.statusMapping = statusMapping;
    }
}
@配置
@配置属性(前缀=“状态”)
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
公共类状态属性{
私有地图状态映射;
公共映射getStatusMapping(){
返回状态映射;
}
public void setStatusMapping(映射状态映射){
this.statusMapping=状态映射;
}
}

问题是此映射返回为空。我一定是做错了什么。也许在春天这样做是不可能的?

关于数据类型及其分配,我不确定您的选择。我建议你重新考虑一下这个设计


关于你的主要问题: Spring不知道,status.*应该映射到私有映射statusMapping。另外,由于您的类名为*properties,因此您似乎不希望它成为
@Configuration
类。考虑以下模式:

首先,创建一个properties类来保存属性:

status.available=00, STATUS.ALLOWED
status.forbidden=01, STATUS.FORBIDDEN
status.authdenied=05, STATUS.AUTH_DENIED
@ConfigurationProperties(prefix = "status")
public class StatusProperties {

    private Map.Entry<Integer, String> available;
    private Map.Entry<Integer, String> forbidden;
    private Map.Entry<Integer, String> authdenied;

    public Map.Entry<Integer, String> getAvailable() {
        return available;
    }

    public void setAvailable(Map.Entry<Integer, String> available) {
        this.available = available;
    }

    public Map.Entry<Integer, String> getForbidden() {
        return forbidden;
    }

    public void setForbidden(Map.Entry<Integer, String> forbidden) {
        this.forbidden = forbidden;
    }

    public Map.Entry<Integer, String> getAuthdenied() {
        return authdenied;
    }

    public void setAuthdenied(Map.Entry<Integer, String> authdenied) {
        this.authdenied = authdenied;
    }
}
我找到了解决办法:

应用程序属性

app.statuses[0].id=00
app.statuses[0].title=STATUS.ALLOWED
app.statuses[1].id=01
app.statuses[1].title=STATUS.FORBIDDEN
app.statuses[2].id=02
app.statuses[2].title=STATUS.CONTRACT_ENDED
Properties.java

@Component
@ConfigurationProperties(prefix = "app")
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE)
public class StatusProperties {

    private List<Status> statuses = new ArrayList<>();

    public List <Status> getStatuses () {
        return statuses;
    }

    public void setStatuses (List <Status> statuses) {
        this.statuses = statuses;
    }

    public static class Status {
        private String id;
        private String title;

        public String getId () {
            return id;
        }

        public void setId (String id) {
            this.id = id;
        }

        public String getTitle () {
            return title;
        }

        public void setTitle (String title) {
            this.title = title;
        }
    }
}
@组件
@配置属性(prefix=“app”)
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
公共类状态属性{
私有列表状态=新建ArrayList();
公共列表GetStatus(){
返回状态;
}
公共无效设置状态(列表状态){
this.statuses=状态;
}
公共静态类状态{
私有字符串id;
私有字符串标题;
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共字符串getTitle(){
返回标题;
}
公共无效集合标题(字符串标题){
this.title=标题;
}
}
}

这是标准的做法。这里的想法是动态插入属性,而Spring不知道属性的具体类型。这样,用户可以修改application.properties文件,但不需要修改代码。这样,您甚至可以返回使用对象或字符串作为数据类型。我认为严格键入应用程序道具是一个巨大的好处我找到了解决我问题的办法,就是:我要发布答案。这就是我的意思,建议改变你的设计