java - 实现默认大小验证的验证消息

标签 java spring spring-boot spring-validator

我有 DTO,我想限制其大小:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
public class CreateUserDTO {

    @NotNull
    @NotEmpty
    @Size(min=1, max=20, message = "'Login' value '${validatedValue}' must be between {min} and {max} characters long.")
    private String login;

    @NotNull
    @NotEmpty
    @Size(min=1, max=45, message = "'Email' value '${validatedValue}' must be between {min} and {max} characters long.")
    private String email;

    @NotNull
    @NotEmpty
    @Size(min=1, max=20, message = "'First name' value '${validatedValue}' must be between {min} and {max} characters long.")
    private String firstName;

    @NotNull
    @NotEmpty
    @Size(min=1, max=20, message = "'Last name' value '${validatedValue}' must be between {min} and {max} characters long.")
    private String lastName;
}

休息 Controller :

    @PostMapping("/create")
    public ResponseEntity<?> create(@Valid @RequestBody CreateUserDTO dto) {

        .....

        return ok().build();
    }

知道为什么我会收到这个巨大的错误消息:

{
    "errors": [
        {
            "status": 404,
            "code": "1001",
            "title": "Not found",
            "detail": "Validation failed for argument [0] in public org.springframework.http.ResponseEntity<?> org.engine.rest.UsersController.create(org.engine.dto.CreateUserDTO): [Field error in object 'createUserDTO' on field 'login': rejected value [56dtttttttttt444444444465st]; codes [Size.createUserDTO.login,Size.login,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [createUserDTO.login,login]; arguments []; default message [login],20,1]; default message ['Login' value '56dtttttttttt444444444465st' must be between 1 and 20 characters long.]] ",
            "extra": {
                "detail": "Validation failed for argument [0] in public org.springframework.http.ResponseEntity<?> org.engine.rest.UsersController.create(org.engine.dto.CreateUserDTO): [Field error in object 'createUserDTO' on field 'login': rejected value [56dtttttttttt444444444465st]; codes [Size.createUserDTO.login,Size.login,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [createUserDTO.login,login]; arguments []; default message [login],20,1]; default message ['Login' value '56dtttttttttt444444444465st' must be between 1 and 20 characters long.]] "
            }
        }
    ]
}

最佳答案

查看您评论中的链接存储库,您可以添加一个新的异常处理程序来自定义与约束相关的验证错误。

现在所有未定义的异常都按照定义路由到here .

您可以在 EngineExceptionhandler 中为与约束相关的错误定义异常处理程序类。

有点像

@ExceptionHandler(ConstraintViolationException.class)
ResponseEntity<ErrorResponseDTO> constraintValidationException(final ConstraintViolationException e) {
    List<ErrorRerponse> errors = new ArrayList<>();
    for (ConstraintViolation violation : e.getConstraintViolations()) {
        ErrorResponse error = new ErrorResponse();
        error.setTitle(violation.getPropertyPath().toString());
        error.setDetail(violation.getMessage());
        errors.add(error);
    }
    ErrorResponseDTO errorResponse = new ErrorResponseDTO();
    errorResponse.setErrors(errors);
    return new ResponseEntity<ErrorResponseDTO>(errorResponse, HttpStatus.BAD_REQUEST);
}

您可以根据需要添加更多自定义。

关于java - 实现默认大小验证的验证消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67994305/

相关文章:

java - 单元测试嵌套子流(子流的子流)

java - 有没有办法使用调用远程 EJB 的嵌入式容器创建 Spring Boot 应用程序?

java - 无法识别java 8 lambda但配置没问题

sql-server - 无法从 Docker 容器连接到外部 SQL Server

java - 具有多种配置的Spring Boot测试

java - 导入 Maven 模块中的 Lombok

java - Maven 在 spring roo 中给出错误

java - Spring MVC : Saving a string in servlet-context and accessing from java code

java - Spring Security 国际化消息不会被覆盖

Spring Boot ServletRegistrationBean 和部署到外部 Tomcat