项目中遇到的一些问题总结(十五)

JSR303校验

JSR-303是Java中流行的校验框架,也称为Bean Validation,其主要目的是验证Java类中的字段,以确保它们符合预期的规则。JSR-303提供了一组统一的校验注解,可以应用于任何JavaBean类的属性上,例如字符串长度、正则表达式、null检查等。

下面是一个使用JSR-303校验的示例代码:

import javax.validation.constraints.*;
import java.util.Date;

public class User {
    
    

    @NotEmpty(message = "用户名不能为空")
    @Size(min = 4, max = 20, message = "用户名长度必须为4到20位")
    private String username;

    @NotEmpty(message = "密码不能为空")
    @Size(min = 6, max = 20, message = "密码长度必须为6到20位")
    private String password;

    @NotEmpty(message = "邮箱不能为空")
    @Email(message = "请输入正确的邮箱地址")
    private String email;

    @NotNull(message = "生日不能为空")
    @Past(message = "生日必须是一个过去的日期")
    private Date birthday;

    // getter和setter方法省略
}

在上述示例中,我们定义了一个名为User的JavaBean类,其中包含四个被JSR-303的校验注解修饰的属性,分别为:username、password、email和birthday。

@NotEmpty注解和@Size注解用于验证字符串是否非空以及字符串长度是否在指定的范围之内,@Email注解表示该字段必须符合电子邮箱地址的格式,@NotNull注解和@Past注解用于验证日期不能为空以及日期是否在过去。

如果我们要在控制器中验证用户输入、调用服务,并在出现错误时显示相应的消息,可以这样实现:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

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

    @PostMapping("/register")
    public void register(@RequestBody @Validated User user) {
    
    
        // 调用用户注册服务
    }

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
    
    
        // 根据ID查询用户信息
        User user = userService.getUserById(id);
        if (user == null) {
    
    
            throw new UserNotFoundException(id);
        }
        return user;
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ErrorResponse handleValidationException(MethodArgumentNotValidException ex) {
    
    
        BindingResult bindingResult = ex.getBindingResult();
        StringBuilder errorMessages = new StringBuilder();
        for (FieldError error : bindingResult.getFieldErrors()) {
    
    
            errorMessages.append(error.getDefaultMessage()).append("; ");
        }
        return new ErrorResponse("validation_error", errorMessages.toString());
    }
}

需要注意的是,为了使JSR-303校验注解的生效,我们需要在需要使用校验属性的方法上使用@Validated注解,从而触发校验逻辑,如果校验失败,则会抛出异常,我们可以通过全局异常处理器来处理这些异常,并返回给客户端。

总的来说,JSR-303校验是Java中强大的校验框架之一,它提供了一组统一的校验注解,可以应用于任何JavaBean类的属性上,用于校验请求参数是否符合预期的规则,简化了我们的开发工作。

@Validated注解

@Validated注解是Spring框架中用于启用JSR-303或者JSR-349校验(也被称为Bean Validation)的注解。它可以放在类或者方法上,用于标注需要进行参数校验的类或者方法。

@Validated注解与@Valid注解的作用类似,它们都可以用于实现Bean Validation功能并触发校验器的执行。但是,它们之间有一个重要的区别,那就是@Validated注解可以指定groups参数,用于指定验证器执行的校验组,而@Valid注解不支持这个功能。

示例代码:

@RestController
@RequestMapping("/users")
@Validated({
    
    Default.class, CreateUser.class})
public class UserController {
    
    

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
    
    
        this.userService = userService;
    }

    @PostMapping
    public void createUser(@RequestBody @Validated(CreateUser.class) User user) {
    
    
        userService.createUser(user);
    }
}

在上面的示例中,我们在UserController类上使用@Validated注解,并指定了Default.class和CreateUser.class这两个校验组。而在createUser方法中,我们也使用了@Validated注解,并指定使用CreateUser.class这个校验组来校验User对象。

需要注意的是,如果只指定了groups参数,而没有指定value参数,则它的默认值就是{}空数组,表示执行默认校验组。如果指定了value参数,则会同时执行默认校验组和指定的校验组。

另外,如果一个类只使用@Validated注解,而没有使用@Valid注解,则Spring框架会使用SpringValidatorAdapter适配器将JSR-303或JSR-349验证转化为Spring框架的验证。而如果使用了@Valid注解,则会使用默认的JSR-303或JSR-349验证器。

总的来说,@Validated注解是Spring框架中用于启用Bean Validation校验的注解。它可以放在类或者方法上,并指定校验组参数,用于触发校验器的执行,并根据校验结果进行相应的处理。

Redis RDB

Redis RDB是Redis的一种持久化方式,用于将内存中的数据保存到磁盘中,以便在Redis重新启动时恢复数据。RDB的全称是Redis DataBase。

RDB的实现方式是在指定的时间间隔内对Redis数据库进行快照,将数据库中的键值对以二进制文件的形式写入到磁盘中。这个过程是由Redis主进程完成的,并且在写入完成后会将文件重命名为指定的文件名,以保证数据的完整性。RDB持久化方式在Redis中的默认配置是关闭的,需要手动开启。

RDB持久化的优点是可以在指定的时间点对Redis数据库进行备份,保证数据的完整性,同时也可以减少Redis在恢复数据时所需的时间。但是RDB持久化方式也有其缺点,例如需要将整个数据库进行快照,可能会占用大量的磁盘空间;同时,如果Redis发生故障,最后一次快照的时间点到故障时间点之间的数据会丢失,无法恢复。

在实际应用中,可以根据具体的业务需求和数据特点选择不同的持久化方式,以达到最优的性能和可靠性。

猜你喜欢

转载自blog.csdn.net/m0_51431003/article/details/131146966