|
|
// 定义包路径,用于存放注入工具类相关的代码。这个包名表明该类属于特定的项目模块(com.yf.exam)下的aspect.utils部分,
|
|
|
// 通常用于组织和管理与注入操作相关的工具类代码。
|
|
|
package com.yf.exam.aspect.utils;
|
|
|
|
|
|
// 导入FastJSON库,它是一个用于将Java对象与JSON字符串进行相互转换的高性能库,
|
|
|
// 在本类的restError方法中用于将API响应对象转换为JSON字符串以便写入HTTP响应中。
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
|
|
// 导入API错误类,它可能定义了一系列表示不同类型API错误的常量或属性,
|
|
|
// 在本类的restError方法中用于创建包含特定错误信息的API响应对象。
|
|
|
import com.yf.exam.core.api.ApiError;
|
|
|
|
|
|
// 导入API响应类,它用于封装API调用的返回结果,包括成功的结果以及可能出现的错误信息等,
|
|
|
// 在本类的restError方法中用于创建要返回给客户端的错误响应对象。
|
|
|
import com.yf.exam.core.api.ApiRest;
|
|
|
|
|
|
// 导入Lombok的Log4j2注解,用于简化日志记录的配置,通过该注解可以方便地在类中使用Log4j2进行日志输出。
|
|
|
import lombok.extern.log4j.Log4j2;
|
|
|
|
|
|
// 导入Spring框架的组件注解,用于标记该类是一个Spring组件,这样Spring容器可以对其进行管理和实例化,
|
|
|
// 使其能够在Spring应用程序中被其他组件所使用。
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
// 导入Java标准库中的HTTP响应类,用于处理HTTP协议相关的响应操作,
|
|
|
// 在本类的restError方法中用于设置响应的编码、内容类型以及写入响应内容等操作。
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
// 导入Java标准库中的IO异常类,用于处理输入输出操作过程中可能出现的异常情况,
|
|
|
// 在本类的restError方法以及其他可能涉及到IO操作的地方用于捕获和处理相关异常。
|
|
|
import java.io.IOException;
|
|
|
|
|
|
// 导入Java标准库中的反射字段类,用于通过反射操作对象的私有字段,
|
|
|
// 在本类的setValue和getFiled方法中用于获取和设置对象的指定字段的值。
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
|
/**
|
|
|
* 注入工具类,提供了一些用于对象字段赋值以及处理错误响应返回等功能的方法。
|
|
|
* @author bool
|
|
|
* @date 2019-07-17 09:32
|
|
|
*/
|
|
|
@Log4j2 // 使用Log4j2注解启用日志记录功能,方便在类中记录相关操作的日志信息。
|
|
|
@Component // 将该类标记为Spring组件,使其能够被Spring容器管理和使用。
|
|
|
public class InjectUtils {
|
|
|
|
|
|
/**
|
|
|
* 给指定对象的指定字段赋值的方法。
|
|
|
*
|
|
|
* @param object 要进行赋值操作的对象。
|
|
|
* @param value 要赋给指定字段的值。
|
|
|
* @param fields 一个可变参数,用于指定要赋值的字段名数组。
|
|
|
* @throws Exception 如果在获取字段或设置字段值的过程中出现异常,则抛出。
|
|
|
*/
|
|
|
public void setValue(Object object, Object value, String... fields) throws Exception {
|
|
|
// 遍历要赋值的字段名数组
|
|
|
for (String fieldName : fields) {
|
|
|
// 根据对象的类和字段名获取对应的字段对象
|
|
|
Field field = this.getFiled(object.getClass(), fieldName);
|
|
|
|
|
|
// 如果获取到的字段对象为空,说明未找到对应的字段,继续下一个字段的处理。
|
|
|
if (field == null) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
// 通过反射设置该字段可访问,因为私有字段默认是不可直接访问的。
|
|
|
field.setAccessible(true);
|
|
|
|
|
|
// 使用反射设置该字段的值为传入的值,即将指定的值赋给对象的指定字段。
|
|
|
field.set(object, value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据目标类和字段名获取对应的字段对象的方法。
|
|
|
*
|
|
|
* @param clazz 目标类,即要在其中查找字段的类。
|
|
|
* @param fieldName 要查找的字段名。
|
|
|
* @return 返回找到的字段对象,如果未找到则返回null。
|
|
|
*/
|
|
|
private Field getFiled(Class clazz, String fieldName) {
|
|
|
System.out.println("注入的类:" + clazz.toString()); // 打印当前正在查找字段的目标类的信息,方便调试查看。
|
|
|
|
|
|
// 尝试获取当前类中指定字段名的字段对象
|
|
|
try {
|
|
|
return clazz.getDeclaredField(fieldName);
|
|
|
} catch (Exception e) {
|
|
|
log.error(clazz.toString() + ": not exist field, try superclass " + fieldName); // 如果获取字段失败,记录错误日志,
|
|
|
// 提示在当前类中不存在指定字段,
|
|
|
// 并准备尝试在父类中查找。
|
|
|
|
|
|
// 如果当前类未找到指定字段且存在父类,则递归调用本方法在父类中继续查找指定字段。
|
|
|
if (clazz.getSuperclass()!= null) {
|
|
|
return this.getFiled(clazz.getSuperclass(), fieldName);
|
|
|
}
|
|
|
|
|
|
// 如果在当前类及其所有父类中都未找到指定字段,则返回null。
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 用于处理错误情况并将错误结果返回给客户端的方法,通过设置HTTP响应的相关属性和写入错误响应内容来实现。
|
|
|
*
|
|
|
* @param response HTTP响应对象,用于向客户端发送响应信息。
|
|
|
* @throws IOException 如果在设置响应属性或写入响应内容过程中出现IO异常,则抛出。
|
|
|
*/
|
|
|
public static void restError(HttpServletResponse response) {
|
|
|
try {
|
|
|
// 创建一个包含特定API错误信息的API响应对象,这里使用了ApiError.ERROR_10010002作为错误码,
|
|
|
// 具体含义可能在ApiError类中定义,通常表示某种常见的错误情况。
|
|
|
ApiRest apiRest = new ApiRest(ApiError.ERROR_10010002);
|
|
|
|
|
|
// 设置HTTP响应的字符编码为UTF-8,确保能够正确处理和传输各种字符,特别是中文等非ASCII字符。
|
|
|
response.setCharacterEncoding("UTF-8");
|
|
|
|
|
|
// 设置HTTP响应的内容类型为application/json,表明返回给客户端的内容是JSON格式的数据。
|
|
|
response.setContentType("application/json");
|
|
|
|
|
|
// 将创建的API响应对象转换为JSON字符串,并写入到HTTP响应的输出流中,以便客户端能够接收到错误信息。
|
|
|
response.getWriter().write(JSON.toJSONString(apiRest));
|
|
|
|
|
|
// 关闭HTTP响应的写入流,释放相关资源。
|
|
|
response.getWriter().close();
|
|
|
} catch (IOException e) {
|
|
|
// 如果在设置响应属性或写入响应内容过程中出现IO异常,这里只是简单地捕获异常,
|
|
|
// 可以根据实际需求进一步处理异常,比如记录更详细的日志信息等。
|
|
|
}
|
|
|
}
|
|
|
} |