Java 在枚举内使用属性值时发生Spring启动错误

Java 在枚举内使用属性值时发生Spring启动错误,java,spring-boot,enums,properties,Java,Spring Boot,Enums,Properties,我有一个Spring启动项目,我正在尝试恢复.properties文件的值,并在枚举中使用它 我遵循下面的步骤 我有一个文件application.properties,其值为000。我通过以下方式恢复该值: @RestController public class ReadProperty { @Value("${value}") public String value; public String getValueProperty() { ret

我有一个Spring启动项目,我正在尝试恢复.properties文件的值,并在枚举中使用它

我遵循下面的步骤

  • 我有一个文件
    application.properties
    ,其值为
    000
    。我通过以下方式恢复该值:

    @RestController
    public class ReadProperty {
    
        @Value("${value}")
        public String value;
    
        public String getValueProperty() {
            return this.value;
        }
    
        @GetMapping(value = "/get")
        public String getValue() {
            System.out.println("read value is " + value);
            return value;
        }
    
        @GetMapping(value = "/getEnum")
        public String getValueEnum() {
    
            String response = EnumInsideAClass.TEST.toString();
    
            System.out.println("response value is " + response);
            return response;
        }
    }
    
如果我在一个类中使用value,我会毫无问题地得到值000

  • 我在类中创建了一个枚举,如下所示

    public class EnumTest {
    
        @Autowired
        static ReadProperty readProperty;
    
        public final static String VAL = readProperty.getValueProperty();
    
        public enum EnumInsideAClass {
    
            TEST(VAL);
    
            private String value;
    
            private EnumInsideAClass(String value) {
                this.value = value;
            }
    
            @Override
            public String toString() {
                return this.value;
            }
        }
    }
    
问题是在enum类中我需要一个静态变量。如果我使用

@Value("${value}")
public static String value;
该值将更改为null

因此,我尝试使用get方法访问该值,但该值仍然为null

我没有主意了,我能做什么?是否可以在枚举内使用属性值


非常感谢

您描述的问题与
@Value
位于
枚举中无关,而是与您尝试将属性值注入静态变量有关

Spring将允许您直接在非静态非静态字段中注入值。如果您想在本例中执行此操作,您可以通过setter方法代理注入,例如:

public static String value;

@Value("${value}")
public void setValue(String someValue) {
    SomeClass.value = someValue;
}

但我建议你要非常清楚自己在做什么。由于这将是一个非最终字段,它也是公共的静态的,您需要知道谁可以访问它,谁可以更改它的值。

要添加,我不明白为什么您不能将普通枚举映射到属性。“而不是做这种疯狂的事。”达伦·福赛斯,的确如此。我只是给他问题的答案。另外,对我来说,整个
@Value
注入虽然在某些情况下很方便,但不是一个好主意。最终,项目中分散着大量的属性,而没有一个公共的分组位置。这就是为什么我更喜欢使用
@ConfigurationProperties
将它们组合在一起的属性服务。这样我只要在需要的时候注射就可以了。谢谢你的回复!我重新考虑过去掉枚举的字段,直接从属性中使用它。并通过@ConfigurationProperties恢复属性