ConfigurationProperties和ConstructorBinding的复杂类型DefaultValue

时间:2020-03-31 15:14:04

标签: java spring spring-boot

默认情况下,我想拥有一个不可变的属性类,其中所有字段都为该属性。将财产包括在图书馆中。 默认情况下,我可以使用简单类型创建不可变属性类,但是不能使用复杂类型。有没有一种方法可以将复杂类型的默认值设置为不可变的ConfigurationProperties类?

import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;

@ConfigurationProperties(prefix = "foo")
@ConstructorBinding
@Getter
public final class AnyProperties {
   private final String something
   private final AnySubProperties sub;

   public AnyProperties(
      @DefaultValue("foo") String something, 
      AnySubProperties sub // Any annotation here ? Like @DefaultValue
   ) {
       this.something = something;
       this.sub = sub; // Always null !
   }

   @Getter
   public static final class AnySubProperties {
       private String finalValue;

       public AnySubProperties(@DefaultValue("bar") String finalValue) {
          this.finalValue = finalValue;
       }
   }
}

例如,subnull(如果未定义属性(使用yamlproperty file)。
我想将sub设置为finalValue(带有栏value)。

感谢答案。

编辑带有注释的解决方案

我找到了没有注释的解决方案,但是我是个懒惰的男孩,那为什么不可能有带有弹簧注释的解决方案呢?

import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;

@ConfigurationProperties(prefix = "foo")
@ConstructorBinding
@Getter
public final class AnyProperties {
   private final String something
   private final AnySubProperties sub;

   @ConstructorBinding
   public AnyProperties(
      @DefaultValue("foo") String something, 
      AnySubProperties sub // Any annotation here ? Like @DefaultValue
   ) {
       this.something = something;
       this.sub = null != sub ? sub : new AnySubProperties();
   }

   @Getter
   public static final class AnySubProperties {
       private static final String DEFAULT_FINAL_VALUE = "bar";
       private String finalValue;

       public AnySubProperties() {
           this(DEFAULT_FINAL_VALUE);
       }

       @ConstructorBinding
       public AnySubProperties(@DefaultValue(DEFAULT_FINAL_VALUE) String finalValue) {
          this.finalValue = finalValue;
       }
   }
}

1 个答案:

答案 0 :(得分:1)

您非常亲密。您只需将@DefaultValue批注(不带参数)添加到该批注中即可:

Process process1 = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName =this.path+ "\\DATA\\deviceinfo.exe",
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true
                    }
                };
            process1.Start();
            while(!process1.StandardOutput.EndOfStream)
            {
                string text = process1.StandardOutput.ReadLine();
                if (text.Contains("ProductVersion"))
                {

                }
                else
                {
                //  text.Contains(ProductVersion);
                    TextBox textbox = this.textbox2;
                    textbox.Text = textbox.Text + text;
                }

这样,您不需要AnySubProperties的默认构造函数。其余的构造函数将用于创建具有默认值的AnySubProperties实例。