当前位置: 首页 > 面试题库 >

在Spring Boot应用程序中对@Value带注释的字段实施约束

唐阳泽
2023-03-14
问题内容

我的以下字段带有@Value,指定了默认值:

@Value("${tolerance.percentage:25}")
private int tolerance;

如果该属性存在,该代码将字段的值正确初始化为系统属性“ tolerance.percentage”。如果不存在,则默认为25。

不过,我想进一步加强此int字段的最小值和最大值,因为它表示一个整数百分比小于100,而且墨菲定律意味着某人(可能是我)可以从外部对属性进行配置,而我应用程序将在运行时开始做奇怪的事情,这对于我来说太晚了。如果在应用程序启动时将该属性设置为“
101”或“
-1”,我希望抛出一个错误。哎呀,我什至希望在@Value注释中将其默认设置为101时引发错误,但这对于此问题而言并不重要。这是我尝试过的:

//@Min and @Max don't produce the intended behavior when combined with @Value
@Min(0)
@Max(100)
@Value("${tolerance.percentage:25}")
private int tolerance;

我可以在知道的int字段上强制执行最小值和最大值@Value吗?


问题答案:

使用常规验证API批注的验证仅在某些情况下有效。

  1. 您在类路径上有一个实现(“ hibernate-validator”)
  2. 它们所在的类用于绑定外部配置

因此,@Value您可能不想创建那些包含预期属性并使用与绑定的类,而不是与它们一起使用@ConfigurationProperties。(并且您可能想使用它@Range)。

@ConfigurationProperties(prefix="tolerance")
public ToleranceProperties {

    @Range(min=1, max=100)
    private int percentage = 25;

    // Here be a getter/setter
}

这结合在@Configuration添加@ EnableConfigurationProperties(ToleranceProperties.class),您可以在需要属性的任何地方使用它。(请参阅参考指南中的类型安全配置属性。

注意:您也可以将其声明为@Component



 类似资料:
  • 我有以下字段注释,指定默认值: 该代码正确地将字段值初始化为系统属性“tolerance.percentage”(如果该属性存在)。如果不存在,则默认为25。 不过,我想更进一步,在这个int字段上强制执行最小和最大值,因为它表示整个数字小于100的百分比,墨菲定律意味着有人(可能是我)可以从外部错误配置属性,我的应用程序将启动在运行时做奇怪的事情,这对我来说太迟了。我想抛出一个错误,如果属性设置

  • 问题内容: 我需要创建一个自定义约束注释,该注释可以访问我的bean的另一个字段的值。我将使用此批注来验证字段,因为它取决于另一个字段的值,但是我定义该字段的方式是编译器在我的字段“必须为常量表达式”中说“批注属性的值”。 我以这种方式定义了它: 在我的豆子中,我想要这样的东西: 有什么方法可以定义注释,以便字段值可以是变量? 谢谢 问题答案: 最简单的方法是退后一步:您编写的约束/验证器在字段级

  • 问题内容: 什么是实现注释的有效用例? 在设计主要基于注释的配置系统时,我有时需要创建实现代码生成或程序配置的注释的类。 另一种选择是将批注中包含的数据镜像到DTO中,这似乎是一项开销。 这是一个例子: 与实施 我为此收到编译器警告,但是对于许多用例来说,它似乎是一个有效的工具。 上面示例的警告是 注释类型Id不应用作IdImpl的超级接口 编辑: 我刚刚从Guice找到了这个例子: 从Names

  • 我对@Async和Rest模板调用有问题;下面是我的主要应用程序类,带有一个任务执行器Bean和EnableAsync注释 这是我在Rest控制器中调用的带有异步注释的my测试服务: 此服务在rest模板上返回一个nullPointer;这是stacktrace 但是如果我删除@enableAsync和@Async,那么简单的Rest模板可以很好地工作。 当我传递HttpServlet请求时,Ec

  • 所以我有一些定制的POJO。每当我通过空构造函数实例化该对象时,我都希望将它的filed 初始化为来自< code > application . properties 的某个预设值。 在我的中: 我的POJO类: 在我的类中,我使用空构造函数实例化。但是当我打印字段时,我得到零。 如何使该字段的值为1500,我从< code > application-prod . properties 中获得

  • 问题内容: 我正在尝试找出将带注释的字段(例如任何聚合的(计算的)字段)添加到DRF(模型)序列化器的最佳方法。我的用例仅是端点返回未存储在数据库中但从数据库计算出的字段的情况。 让我们看下面的例子: models.py serializers.py 所需的JSON输出: 我有几个可行的解决方案,但是每个解决方案都有一些问题。 选项1:为模型添加吸气剂并使用SerializerMethodFiel