首页 > 解决方案 > Javax 验证不包括字段名称

问题描述

我们已经构建了一个 API,在我们的模型中我们有一个字段

@Min(1) @Max(16)
private Long demoField;

当我们向 demoField 提供 17 时,它会在客户端向我们抛出错误

"must be less than or equal to 16"

但是当我们看到违规消息时,它包含字段名称,消息看起来像

"demoField: must be less than or equal to 16"

因此,为什么我们没有在客户端错误消息中获取字段名称的问题。

我错过了什么吗?

基于 Spring Boot 构建的 API

标签: javaspringvalidation

解决方案


默认情况下不通过。您可以实现自己的错误处理程序来自定义传回的消息,例如使用@ControllerAdvice。

一种方法是只指定消息:@Min(value = 5, message="Age must be at least 5")

在@ControllerAdvice 中的这种情况下,您只需要阅读 getDefaultMessage()

如果您不想手动添加默认消息,则该方法将按照以下方式实现(使用适当的空检查等):

package com.example.demo;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleBindException(
            BindException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return new ResponseEntity<>(
                ex.getFieldError().getField() + ": " + ex.getFieldError().getDefaultMessage(),
                headers,
                status);
    }
}


推荐阅读