当前位置: 首页 > 知识库问答 >
问题:

如何在启动Spring Boot应用程序时自动验证@Configuration类?

洪昊然
2023-03-14

我有个班叫MyConfig.java.

    import javax.validation.constraints.NotNull;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;

    @Configuration
    public class MyConfig {
       @NotNull
       @Value("${test.key}")
        public String queryIndex;
     }

我的问题是,它是如何在没有任何验证或有效的情况下在Spring Boot应用程序的启动中得到验证的。我理解@Configuration类由启动时的Spring容器拾取(如果有的话,生成bean定义),javax.validator在类路径上。

下面的代码段很有意义,因为在POJO类上添加了@Valid注释:

    @PostMapping
    public String test(@Valid @RequestBody Employee emp) {
        
        return "";
    }

来自 Spring Doc:-

链接此处以供参考

3.8.1. JSR-303bean验证API概述

JSR-303标准化了Java平台的验证约束声明和元数据。使用此API,可以使用声明性验证约束注释域模型属性,并且运行时强制执行这些约束。

共有1个答案

国俊艾
2023-03-14

以下是解决方案:-

MyConfig.java

import javax.validation.constraints.NotBlank;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@Configuration
@Validated
@ConfigurationProperties(prefix="test")
public class MyConfig {
    
    private Logger logger = LoggerFactory.getLogger(MyConfig.class);
    private static final String MYNAME = MyConfig.class.getSimpleName();
    
    @NotBlank(message = "Key should not be empty")
    @Value("${test.key}")
    public String test;

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }
   }

应用程序属性

server.port=5555
test.key=
test.name=

这种依赖性是pom.xml必须的

 <dependency>
     <groupId>javax.validation</groupId>
     <artifactId>validation-api</artifactId>
     <version>2.0.1.Final</version>
  </dependency>

因此,@Validated、@ConfigurationProperties和javax.validation约束在幕后起作用。

错误说明:-

绑定到目标org.springframework.boot.context.properties.bind.BindExcture:未能将测试下的属性绑定到com.cgi.demo.MyConfig$$EnhancerBySpringCGLIB$$3dcd81ec失败:

Property: test.test
Value: 
Reason: Key should not be empty

请参考SprinBoot文档:-

点击这里获取更多信息

2.7.9. @配置属性验证

Spring Boot尝试验证@ConfigurationProperties类,只要这些类使用Spring的@验证注释进行注释。您可以直接在配置类上使用JSR-303javax.validation约束注释。为此,请确保类路径上有兼容的JSR-303实现,然后向字段添加约束注释。

 类似资料:
  • 问题内容: 我尝试使用范围类型APPLICATION和带有@ Create,@ Beg的方法来注释类,但这似乎不起作用。 我想要的是在应用程序启动时立即启动无限循环。 问题答案: 如果希望在初始化后立即执行方法,则可以使用以下注释:

  • 我有一份Java申请。 应用程序有一个决定应用程序是否在启动时启动的设置。 目前,我通过在StartUp items文件夹中放置/删除快捷方式实现了这一点。 然而,我想知道是否有更好的方法来处理这种行为。 编辑 是的,是视窗。抱歉之前没有清除。 应用程序有一个UI,用户可以在其中触发操作,并且应用程序在运行时定期在后台运行一些任务。 @Peter,如何使用应用程序中的代码更改注册表?这种方法是否与

  • 问题内容: 我有一个Java应用程序。 该应用程序具有一个设置,该设置决定该应用程序是否在启动时启动。 目前,我可以通过在“启动项目”文件夹中放置/删除快捷方式来实现此目的。 但是,我想知道是否有更好的方法来处理此行为。 编辑 是的,它是Windows。抱歉,之前没有清除该内容。 该应用程序具有一个用户可以在其中触发动作的UI,并且该应用程序在运行时会定期在后台运行一些任务。 @Peter,如何在

  • 我想在用户收到应用程序上的通知时自动启动应用程序。启动程序图标上不会有点击操作。

  • 我在stackoverflow上发现了类似的问题,并试图用这种方式(LINK)解决这个问题,但在我的项目中没有起作用。谁能给我一些建议吗? pom.xml 应用属性

  • 我有一个Web应用程序部署到Tomcat的实例中。我希望能够将tomcat配置为在Tomcat本身启动时不自动启动该应用程序。但是,我确实希望启动Tomcat管理器,以便根据需要,我可以手动启动和停止Web应用程序。 我如何说服Tomcat这样工作?