用isAnnotationPresent判断类里的字段是否有注解做导出用一直返回false,求大神帮忙看看问题倒是怎么引起的
使用这个isAnnotationPresent方法判断实体类里的字段是否有注解做导出用一直返回false,看了好久不知道是怎么引起的
1-实体
@Data
@EqualsAndHashCode(callSuper=false)
@ToString
public class SysJob extends AbstractPo {
private static final long serialVersionUID = 1L;
/** 任务ID */
@Excel(name = "任务序号", sort = 0)
private String jobId;
/** 任务名称 */
@Excel(name = "任务名称", sort = 0)
private String jobName;
/** 任务组名 */
@Excel(name = "任务组名", sort = 0)
private String jobGroup;
/** 任务方法 */
@Excel(name = "任务方法", sort = 0)
private String methodName;
/** 方法参数 */
@Excel(name = "方法参数", sort = 0)
private String methodParams;
/** cron执行表达式 */
@Excel(name = "执行表达式 ", sort = 0)
private String cronExpression;
/** cron计划策略 */
@Excel(name = "计划策略 ", sort = 0)
private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
/** 任务状态(0正常 1暂停) */
@Excel(name = "任务状态", sort = 0)
private String status;
}
2-自定义的Excel注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {
/** 对应的列名称 */
abstract String name() default "";
/**
* 提示信息
*/
public abstract String prompt() default "";
/**
* 设置只能选择不能输入的列内容.
*/
public abstract String[] combo() default {};
/** 列序号 */
abstract int sort();
/** 字段类型对应的格式 */
abstract String format() default "";
/** 是否需要校验 */
abstract boolean isCheck() default false;
/** 校验字段长度 */
abstract int fieldLength() default 50;
/** 校验是否可以为空 */
abstract boolean isEmpty() default true;
/**
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
*/
public abstract boolean isExport() default true;
}
3-用junit测试就没问题
public class JunitTest extends BaseTest {
@Test
public void test01() {
Field[] allFields = new SysJob().getClass().getDeclaredFields();
// 得到所有field并存放到一个list中.
for (Field field : allFields) {
System.out.println(field + "===1==" + field.isAnnotationPresent(Excel.class));
System.out.println(field + "==2===" + field.getAnnotation(Excel.class));
}
}
}
4-调用这个工具类的时候走到这块判断isAnnotationPresent一直返回false
public class ExcelUtil<T> {
private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
public Class<T> clazz;
public ExcelUtil(Class<T> clazz) {
this.clazz = clazz;
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @return 结果
*/
public String exportExcel(List<T> list, String sheetName) {
OutputStream out = null;
HSSFWorkbook workbook = null;
try {
// 得到所有定义字段
Field[] allFields = clazz.getDeclaredFields();
List<Field> fields = new ArrayList<Field>();
// 得到所有field并存放到一个list中.
for (Field field : allFields) {
if (field.isAnnotationPresent(Excel.class)) {
fields.add(field);
}
}
5-这是我调用的地方
@RequestMapping("/exportsExcel")
@ResponseBody
public void exportsExcel(HttpServletResponse response) throws Exception {
ExcelUtil<SysJob> util = new ExcelUtil<SysJob>(SysJob.class);
List<SysJob> arrayList = new ArrayList<SysJob>();
SysJob sysJob1 = new SysJob();
sysJob1.setJobId("1");
sysJob1.setJobName("121313");
sysJob1.setJobGroup("qweqwe");
sysJob1.setStatus("0");
arrayList.add(sysJob1);
util.exportExcel(arrayList,"测试");
}