import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target({ElementType.FIELD})
public @interface EnumOptions {
Class<?> EnumType();
String customEnumElement() default "";
String customEnumView() default "";
}
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target({ElementType.FIELD})
public @interface Export {
String name() default "";
}
public static <T> boolean doExport(Class<T> clz, List<T> dataList, OutputStream os) {
try {
StringBuffer buf = new StringBuffer();
Field[] fields = clz.getDeclaredFields();
List<Field> fieldList = Arrays.stream(fields).filter(field -> field.isAnnotationPresent(Export.class))
.collect(Collectors.toList());
Map<String,Export> fieldMapping = new HashMap<>();
fieldList.stream().forEach(element ->{
Export export = element.getAnnotation(Export.class);
buf.append(export.name()).append(CSV_COLUMN_SEPARATOR);
fieldMapping.put(element.getName(),export);
});
buf.append(CSV_RN);
if(null == dataList || dataList.size()==0){
os.write(buf.toString().getBytes("GBK"));
os.flush();
return true;
}
Map<String, Map<String,String>> enumMappings = new HashMap<>();
List<Field> fieldEnums = fieldList.stream().filter(field -> field.isAnnotationPresent(EnumOptions.class))
.collect(Collectors.toList());
fieldEnums.stream().forEach(element ->{
EnumOptions enumOptions = element.getAnnotation(EnumOptions.class);
enumMappings.put(element.getName(),enumMapping(enumOptions));
});
dataList.stream().forEach(element ->{
fieldList.stream().forEach(field->{
Object object = BeanUtil.getProperty(field.getName(), element);
Map<String,String> map = enumMappings.get(field.getName());
if(map == null || map.isEmpty()){
buf.append(object).append(CSV_COLUMN_SEPARATOR);
}else {
buf.append(map.get(object.toString())).append(CSV_COLUMN_SEPARATOR);
}
});
buf.append(CSV_RN);
});
// 写出响应
os.write(buf.toString().getBytes("GBK"));
os.flush();
return true;
} catch (Exception e) {
logger.error("doExport错误...", e);
}
return false;
}
private static Map<String,String> enumMapping(EnumOptions enumOptions){
Class enumType = enumOptions.EnumType();
Object[] constants = enumType.getEnumConstants();
Map<String, String> map = new HashMap<>(constants.length);
try {
Field field = enumType.getDeclaredField(enumOptions.customEnumElement());
if (!field.isAccessible()) {
field.setAccessible(true);
}
Field viewField = enumType.getDeclaredField(enumOptions.customEnumView());
if (!viewField.isAccessible()) {
viewField.setAccessible(true);
}
for (Object constant : constants) {
String key = String.valueOf(field.get(constant));
String view = String.valueOf(viewField.get(constant));
if (key != null) {
map.put(key, view);
}
}
}catch (Exception e){
logger.error("enum mapping fail:{}",e);
}
return map;
}