我有以下枚举:
public enum MyEnum {
NAME("Name", "Good", 100),
FAME("Fame", "Bad", 200);
private String lowerCase;
private String atitude;
private long someNumber;
MyEnum(String lowerCase, String atitude, long someNumber) {
this.lowerCase = lowerCase;
this.atitude = atitude;
this.someNumber = someNumber;
}
}
我想使用application.properties文件为枚举的两个实例设置不同的someNumber变量。 这是否可能,如果不能,我是否应该使用抽象类/接口将其分为两个类?
答案 0 :(得分:2)
您不能/不应该在Java中更改枚举的值。尝试改用一个类:
public class MyCustomProperty {
// can't change this in application.properties
private final String lowerCase;
// can change this in application.properties
private String atitude;
private long someNumber;
public MyCustomProperty (String lowerCase, String atitude, long someNumber) {
this.lowerCase = lowerCase;
this.atitude = atitude;
this.someNumber = someNumber;
}
// getter and Setters
}
比创建自定义ConfigurationProperties:
@ConfigurationProperties(prefix="my.config")
public class MyConfigConfigurationProperties {
MyCustomProperty name = new MyCustomProperty("name", "good", 100);
MyCustomProperty fame = new MyCustomProperty("fame", "good", 100);
// getter and Setters
// You can also embed the class MyCustomProperty here as a static class.
// For details/example look at the linked SpringBoot Documentation
}
现在,您可以在application.properties文件中更改my.config.name.someNumber
和my.config.fame.someNumber
的值。如果要禁止更改小写字母/高度,请将其定型。
在使用它之前,您必须使用 @Configuration
注释一个@EnableConfigurationProperties(MyConfigConfigurationProperties.class)
类。另外,将org.springframework.boot:spring-boot-configuration-processor
添加为可选依赖项,以获得更好的IDE支持。
如果要访问值:
@Autowired
MyConfigConfigurationProperties config;
...
config.getName().getSumeNumber();
答案 1 :(得分:1)
那么您可以做的是以下事情:
创建一个新类: MyEnumProperties
@ConfigurationProperties(prefix = "enumProperties")
@Getter
public class MyEnumProperties {
private Map<String, Long> enumMapping;
}
通过
为您的SpringBootApplication /任何Spring Config启用ConfigurationProperties@EnableConfigurationProperties(value = MyEnumProperties.class)
现在将您的号码添加到 application.properties 文件中,如下所示:
enumProperties.enumMapping.NAME=123
enumProperties.enumMapping.FAME=456
在您的应用程序代码中,自动连接属性,如下所示:
@Autowired
private MyEnumProperties properties;
现在这是一种获取ID的方法:
properties.getEnumMapping().get(MyEnum.NAME.name()); //should return 123
您可以通过这种方式为每个Enum值获取application.properties