Spring boot 2.0 – 用户配置

Spring boot 2.0 - configuration for users

我有一个应用程序(springboot 2),客户想要编辑整数值,它代表 AutoGrowCollectionLimit 的最大值。这个值默认(根据 spring 文档)设置为 256,这对于我们的目的来说是不够的。

设置属性的代码:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

这个值应该可以在配置文件中进行配置(比如说 some.txt),它将作为一个 txt 文件在应用程序旁边提供。现在将 some.txt 文件放在哪里都没有关系,现在即使是应用程序的 root 也可以。

这意味着,作为客户,我可以轻松更改它。打开 some.txt 文件并将值从 i.e.: 256 更改为 i.e.: 555.

在调查过程中,我发现了这一点。但它不适合我的情况。我正在寻找的是 some.txt 文件中具有非常简单属性的配置,即:

AutoGrowCollectionLimit=[configurable_number]

根据 spring 文档,我尝试了以下操作:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

还编辑了 [projectUrl]/src/main/resources/application.yml 如下:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

IDE 期待 \\')\\' 或 \\'}\\',当我试图在以下位置调用此属性时:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

有人可以帮忙吗?


在 Spring Boot 中有多种方法可以创建外部化配置,但是您需要使用 @Value 注入来实现几乎所有这些。

价值注入

要注入配置值,您需要使用 @Value 注释。这可以在您可以使用 @Autowired 的所有相同位置完成。例如,在一个属性上:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

或者通过构造函数或方法:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

或在特定的构造函数或方法参数上:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

您还可以使用此系统使用 : 符号提供默认值,例如:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

所有这些中的 ${} 位都是使用 Spring 表达式语言解释的。在这种情况下,${property} 语法告诉 Spring 从上下文中检索 property 的值,这是通过在上下文中查找所有 PropertySource bean 中的属性来完成的。您也可以通过上下文使用 Environment.getProperty 自己执行此操作,例如:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

使用 @Value 注释更方便,原因与使用 @Autowired

更方便的原因相同

Spring引导配置

由于您使用的是 Spring Boot,因此您的应用程序中已经有一些 PropertySource 实例。例如,您的 application.yml 文件作为 PropertySource 加载。请注意,Spring 会将名为 a.b.c 的属性转换为 YAML 文件中的嵌套文档。在您的情况下,这将是 set.max.collectionLimit.

Spring Boot 通过查找 application.ymlapplication.properties 文件以及其他属性来源(如 System.getProperties())来执行此操作,并且可以在文档中找到 Spring Boot 如何查找这些属性的默认顺序.

外部配置

为了使您的配置外部化,您声明您不想使用 .yml 文件,但是 .properties 呢?例如:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

您可以将此文件放在 .jar 文件旁边,并将其命名为 application.properties。此文件中的任何值都将覆盖您在内部 application.yml 文件中的值。

他们也可以直接在命令行上覆盖它,例如:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

或通过 System 属性:

@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit([configurable_number]);

}
@InitBinder

public void initBinder(WebDataBinder binder) {

  binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

}
set:

  max:

  collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@Value("${com.example.app.host-name}")

private String hostName;
@Value("${com.example.app.host-name}")

public void setHostName(String hostName) { ... }

public MyServiceBean(

    @Value("${com.example.app.host-name}") String hostName,

    @Value("${com.example.app.port}") int port) {

  ...

}
@Value("${com.example.app.port:8180}")

public void setPort(int port) { ... }
ApplicationContext appCtx = ... ;

int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar

所有这些都是覆盖值的有效方法,但前提是您使用值注入,例如通过 @Value.


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161