如何优雅构建自定义 Spring Boot 验证器,让你的代码更加丝滑!

作为一名开发人员,你应该知道确保应用程序中流动的数据的准确性和完整性是多么重要。Spring Boot提供了强大的验证功能,但有时我们需要额外的验证,创建适合特定需求的自定义验证器。

接下来,我们来介绍下如何完整的创建一个自定义验证器。

步骤1:准备Spring Boot应用程序

首先,确保你已经设置了一个Spring Boot项目。可以选择使用Maven或Gradle作为构建工具。在项目的配置文件(pom.xml或build.gradle)中包含必要的依赖项,如spring-boot-starter-web和
spring-boot-starter-validation。

步骤2:创建模型类

创建一个模型类来表示要验证的数据。例如,创建一个简单的User类,包含一个用户名和电子邮件字段:

public class User {
    private String username;
    private String email;

    // getters and setters
}

步骤3:创建自定义验证器

接下来,通过实现org.springframework.validation.Validator接口来创建一个自定义验证器类。该接口定义了supports()和validate()两个方法。

supports()方法检查验证器是否支持给定的类。在我们的例子中,我们想要验证User类,所以如果提供的类是User类或其子类之一,则该方法应返回true。

validate()方法执行实际的验证逻辑,我们可以访问正在验证的对象,执行检查,并使用
org.springframework.validation.Errors对象添加验证错误。

以下是User类的自定义验证器示例:

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        User user = (User) target;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "NotEmpty");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "NotEmpty");

        // Add additional validation logic
        // Example:
        // if (user.getUsername().length() < 5) {
        //     errors.rejectValue("username", "Size.userForm.username");
        // }
    }
}

步骤4:注册自定义验证器

为了让Spring Boot知道自定义验证器,我们需要进行注册。打开应用程序的配置类(通常使用@Configuration注解),并添加一个@Bean方法来实例化自定义验证器。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@Configuration
public class AppConfig {

    @Bean
    public Validator validator() {
        return new UserValidator();
    }

    // 其他配置类和方法...
}

步骤5:使用自定义验证器

要将自定义验证器应用于所需的端点,需要使用@Valid注解相应的方法参数,来触发该对象的验证过程。例如,有一个用于创建新用户的RESTful端点:

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public ResponseEntity<String> createUser(@Valid @RequestBody User user) {
        // 处理用户创建逻辑

        return ResponseEntity.ok("User created successfully");
    }
}

在这个例子中,对user参数使用@Valid注解表示应该使用注册的自定义验证器进行验证。

步骤6:提供错误消息

为了给自定义验证约束提供有意义的错误消息,需要在项目的src/main/resources目录中创建一个messages.properties文件。该文件用于不同的验证约束定义自定义错误消息。打开messages.properties文件并添加以下条目:

# 自定义错误消息
NotEmpty.user.username=Username cannot be empty
NotEmpty.user.email=Email cannot be empty
Size.userForm.username=Username must be at least 5 characters long

在上面的示例中,我们为NotEmpty和Size约束定义了错误消息。

步骤7:测试自定义验证器

现在,我们可以通过触发验证过程来测试自定义验证器。如果发生任何验证错误,它们将自动添加到BindingResult对象中。例如,假设有一个用于创建新用户的请求:

POST /users
Content-Type: application/json

{
  "username": "",
  "email": "test@example.com"
}

当发送这个请求时,验证过程将被触发,如果用户名字段为空,将会向BindingResult中添加一个验证错误。

为了处理验证错误,我们可以修改UserController中的createUser方法,如下所示:

@PostMapping
public ResponseEntity<String> createUser(@Valid @RequestBody User user, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        // 处理验证错误
        List<ObjectError> errors = bindingResult.getAllErrors();
        // 按需处理并返回错误消息
        // 示例: return ResponseEntity.badRequest().body(errors.toString());
    }

    // 如果验证通过,继续处理用户创建逻辑

    return ResponseEntity.ok("User created successfully");
}

在这个例子中,如果存在验证错误,可以使用bindingResult.getAllErrors()从BindingResult对象中检索错误。然后,根据应用程序的需求处理和处理这些错误。

这样,我们已经成功地在Spring Boot应用程序中创建并使用了自定义验证器。自定义验证器允许我们为特定字段或对象定义自己的验证逻辑和错误消息,从而控制验证过程。

开发界的强者

最后,介绍一款软件开发工具。JNPF开发平台,很多人都用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。原理是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。

官网:http://www.jnpfsoft.com/?csdn,如果你有闲暇时间,可以做个知识拓展。

这是一个基于Java Boot/.Net Core构建的简单、跨平台快速开发框架,采用业内领先的SpringBoot微服务架构、支持SpringCloud模式。前后端封装了上千个常用类,方便扩展;采用微服务、前后端分离架构,集成了代码生成器,支持前后端业务代码生成,满足快速开发;框架集成了表单、报表、图表、大屏等各种常用的Demo方便直接使用;后端框架支持Vue2、Vue3,平台即可私有化部署,也支持K8S部署。

为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ``` @Configuration @AutoConfigureAfter(MyBatisConfig.class) public class MyBatisMapperScannerConfig { @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); mapperScannerConfigurer.setBasePackage("com.example.mapper"); return mapperScannerConfigurer; } } ``` 这是一个 Spring Boot Starter 中使用 MyBatis 扫描 mapper 文件的示例代码。 首先在配置类 MyBatisMapperScannerConfig 中声明了一个名为 mapperScannerConfigurer 的 bean。 然后使用 setSqlSessionFactoryBeanName 方法指定 MyBatis 的 SqlSessionFactory bean 的名称。 最后使用 setBasePackage 方法指定 mapper 文件所在的包。 其中 MyBatisConfig.class 为Mybatis配置类,需要配置数据源和SqlSessionFactory,具体可以参考Mybatis官方文档 ``` @Configuration @MapperScan("com.example.mapper") public class MyBatisConfig { @Autowired private DataSource dataSource; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); return sqlSessionFactoryBean.getObject(); } } ``` 另外还可以使用 @MapperScan 注解来简化配置。 ``` 这种方式可以省略 MyBatisMapperScannerConfig 配置类,在MybatisConfig.class中配置即可 ### 回答2: 自定义Spring Boot Starter是为了方便在Spring Boot项目中集成MyBatis数据库操作。以下是一个代码示例: 首先,在你的自定义Starter项目中创建一个自动配置类,例如`MyBatisAutoConfiguration`。在该类中,你可以使用Spring Boot的自动配置特性来配置MyBatis的相关属性,例如数据库连接信息、Mapper扫描等。同时,你也可以定义一些默认的配置项,方便用户进行使用。 ```java @Configuration @EnableConfigurationProperties(MyBatisProperties.class) @ConditionalOnClass(SqlSessionFactory.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class MyBatisAutoConfiguration { @Autowired private MyBatisProperties properties; @Autowired private ResourceLoader resourceLoader; @Bean @ConditionalOnMissingBean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); factory.setDataSource(dataSource); factory.setMapperLocations(this.properties.resolveMapperLocations()); return factory.getObject(); } @Bean @ConditionalOnMissingBean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean @ConditionalOnMissingBean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer scanner = new MapperScannerConfigurer(); scanner.setSqlSessionFactoryBeanName("sqlSessionFactory"); scanner.setBasePackage("your.mapper.package"); return scanner; } } ``` 然后,你需要定义一个配置类`MyBatisProperties`来接收用户的自定义配置,例如数据库连接信息、Mapper扫描路径等。用户在自己的Spring Boot项目中,可以通过配置文件来配置这些属性。 ```java @ConfigurationProperties(prefix = "mybatis") public class MyBatisProperties { private String[] mapperLocations; // getters and setters public Resource[] resolveMapperLocations() { // 根据 mapperLocations 配置的路径解析为 Resource 数组 return Arrays.stream(this.mapperLocations) .map(location -> this.resourceLoader.getResource(location)) .toArray(Resource[]::new); } } ``` 最后,在你的自定义Starter项目中创建一个`spring.factories`文件,并在该文件中添加自定义Starter的自动配置类。 ``` org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyBatisAutoConfiguration ``` 用户在自己的Spring Boot项目中,只需要引入你的自定义Starter依赖,然后在配置文件中配置相关属性,即可使用MyBatis进行数据库操作。 以上就是一个自定义Spring Boot Starter操作MyBatis数据库的代码示例。希望对你有帮助! ### 回答3: 自定义 Spring Boot Starter 可以简化在项目中使用 MyBatis 操作数据库的配置和依赖管理。下面是一个简单的代码示例,演示如何自定义 Spring Boot Starter 并使用它来操作 MyBatis 数据库。 首先,创建一个 Maven 项目,并添加以下依赖项: ```xml <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- MyBatis Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> <!-- 添加数据库驱动,这里以 MySQL 为例 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> ``` 然后,创建一个 Spring Boot Starter 模块,在该模块中进行自定义配置和依赖管理。创建一个类,例如 `MyBatisStarterAutoConfiguration`,在该类中配置数据源和 MyBatis 相关的 bean: ```java @Configuration @ConditionalOnClass({ DataSourceProperties.class, SqlSessionFactory.class }) @EnableConfigurationProperties(MyBatisStarterProperties.class) public class MyBatisStarterAutoConfiguration { private final MyBatisStarterProperties properties; public MyBatisStarterAutoConfiguration(MyBatisStarterProperties properties) { this.properties = properties; } @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); return factoryBean.getObject(); } } ``` 接下来,创建一个 properties 类,用于配置 MyBatis 配置文件的路径,默认为 `classpath:mybatis-config.xml`: ```java @ConfigurationProperties(prefix = "mybatis") public class MyBatisStarterProperties { private String configLocation = "classpath:mybatis-config.xml"; public String getConfigLocation() { return configLocation; } public void setConfigLocation(String configLocation) { this.configLocation = configLocation; } } ``` 在资源文件目录中,配置 MyBatis 的配置文件 `mybatis-config.xml`: ```xml <configuration> <!-- 根据需要配置 MyBatis 的其他相关配置 --> </configuration> ``` 最后,在项目的入口类中引入自定义的 Starter: ```java @SpringBootApplication @Import({ MyBatisStarterAutoConfiguration.class }) public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 以上就是一个简单的示例,通过自定义 Spring Boot Starter 来操作 MyBatis 数据库。使用自定义的 Starter,我们可以将数据库和 MyBatis 的配置集中在一个模块中,使得项目的配置更加清晰和简洁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值