了解最新公司动态及行业资讯
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version></dependency><dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.13.Final</version></dependency>
import javax.validation.constraints.Email;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;public class UserRegistrationDTO {
@NotNull(message = "Username cannot be null")
@Size(min = 3, max = 20, message = "Username must be between 3 and 20 characters")
private String username;
@NotNull(message = "Password cannot be null")
@Size(min = 6, message = "Password must be at least 6 characters")
private String password;
@NotNull(message = "Email cannot be null")
@Email(message = "Email should be valid")
private String email;
// Getters and Setters}import org.springframework.validation.BindingResult;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserController {
@PostMapping("/register")
public String registerUser(@RequestBody @Valid UserRegistrationDTO user, BindingResult result) {
if (result.hasErrors()) {
return result.getAllErrors().stream()
.map(ObjectError::getDefaultMessage)
.collect(Collectors.joining(", "));
}
// Proceed with registration logic
return "User registered successfully";
}}SR是 Java EE 的一种标准,用于基于注解的对象数据验证。在Spring Boot应用中,你可以通过添加注解直接在POJO类中声明验证规则。
这样可以确保在使用这些对象进行操作之前,它们满足业务规则。个人认为非常有用的,像我们中原六仔三合一平台出租系统重也是使用了SR,因为它减少了代码中的校验逻辑,使得校验逻辑更加集中且易于管理。
import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Constraint(validatedBy = PasswordValidator.class)@Target({ ElementType.FIELD, ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)public @interface ValidPassword {
String message() default "Password must contain at least one number and one special character";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};}import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import java.util.regex.Pattern;public class PasswordValidator implements ConstraintValidator<ValidPassword, String> {
private static final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[!@#$%^&*]).{6,}$";
private final Pattern pattern = Pattern.compile(PASSWORD_PATTERN);
@Override
public void initialize(ValidPassword constraintAnnotation) {
}
@Override
public boolean isValid(String password, ConstraintValidatorContext context) {
if (password == null) {
return false;
}
return pattern.matcher(password).matches();
}}public class UserRegistrationDTO {
@NotNull(message = "Username cannot be null")
@Size(min = 3, max = 20, message = "Username must be between 3 and 20 characters")
private String username;
@NotNull(message = "Password cannot be null")
@Size(min = 6, message = "Password must be at least 6 characters")
@ValidPassword
private String password;
@NotNull(message = "Email cannot be null")
@Email(message = "Email should be valid")
private String email;
// Getters and Setters}import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.validation.FieldError;import org.springframework.web.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;import java.util.Map;@RestControllerAdvicepublic class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach(error -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}}