【bug解决】getField抛出NoSuchFieldException详解

在使用java反射,去获取某对象的参数时,源码如下

对象:

public class OcrTempFacilityGuard extends OcrTemp{

    /**
     * 主键
     */
    private Integer guardBarId;
    //其他的省略
}

调用/出错部分:

    @Test
    public void testAnnotation() throws NoSuchFieldException {
        Field id = OcrTempFacilityGuard.class.getField("guardBarId");
        System.out.println(id);
    }

运行时抛出异常

 

 后来把  getFiled() 改为   getDeclaredField()  后,可以获取到参数。

然后深入了解了一下 getFiled()  和   getDeclaredField() 

1.getFiled()  会在底层调用 getFiled0()

 getFiled0() 方法会继续调用  searchFields(),进一步调用  privateGetDeclaredFields () 方法,并默认穿入一个true,看到这里可能就明白了,publicOnly为true,所以改方法返回的字段应该是public修饰的,但是我的字段是private修饰的,所以才会排除未找到当前字段的异常

 2.同样方法,进入 getDeclaredField()方法,发现该方法底层也是调用searchFields(),进一步调用  privateGetDeclaredFields () 方法,但是这里穿入的参数是一个false,所以才可以访问到对象中private修饰的字段

 

 

### 解决 @Valid 异常全局异常处理不生效的方法 为了确保 `@Valid` 或者 `@Validated` 注解引发的异常能够被全局异常处理器捕获,在 Spring Boot 应用程序中,需要配置合适的全局异常处理机制并正确设置验证逻辑。 #### 创建全局异常处理器 通过定义带有 `@ControllerAdvice` 和 `@ResponseBody` 注解的类来创建一个全局异常处理器。此类用于统一管理应用程序中的各种异常情况: ```java import org.springframework.http.HttpStatus; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public @ResponseBody ValidationErrorResponse onMethodArgumentNotValidException( MethodArgumentNotValidException e) { List<String> errors = new ArrayList<>(); for (FieldError error : e.getBindingResult().getFieldErrors()) { errors.add(error.getField() + ": " + error.getDefaultMessage()); } return new ValidationErrorResponse(errors); } } ``` 此代码片段展示了如何捕捉由 `@Valid` 导致的 `MethodArgumentNotValidException` 并返回自定义错误响应给客户端[^1]。 #### 定义错误响应实体 为了让 API 调用方更容易理解发生的错误,建议封装一个简单的数据传输对象(DTO),比如下面的例子展示了一个名为 `ValidationErrorResponse` 的 DTO 类型: ```java import java.util.List; public record ValidationErrorResponse(List<String> errors) {} ``` 这有助于提供结构化的反馈信息给前端应用或其他服务调用者[^3]。 #### 确认依赖项存在 另外,请确认项目已经包含了 Hibernate Validator 作为 Bean Validation 实现的一部分。可以在项目的构建文件 (`pom.xml`) 中加入如下 Maven 依赖声明以引入必要的库支持: ```xml <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.3.Final</version> </dependency> ``` 这样可以保证所有的约束注解都能正常工作,并且当违反这些规则时触发相应的异常事件[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值