OpenCSV导出含枚举的Bean为CSV:如何输出枚举的value属性值?
解决OpenCSV导出枚举时显示枚举名而非自定义value的问题
有两种可行方案,根据你的场景选择:
方案一:自定义字段转换器(推荐,无副作用)
这种方式通过给枚举字段绑定自定义转换器,专门处理CSV导出时的枚举值转换,不会影响枚举在其他业务场景的使用。
1. 编写自定义转换器类
继承OpenCSV的AbstractBeanField,重写convert方法返回枚举的value字段:
import com.opencsv.bean.AbstractBeanField; import com.opencsv.exceptions.CsvDataTypeMismatchException; public class UserRoleConverter extends AbstractBeanField<UserRole, String> { @Override protected String convert(UserRole value) throws CsvDataTypeMismatchException { return value.getValue(); } }
2. 给Bean的枚举字段添加注解绑定转换器
修改你的Bean字段,添加@CsvBindByName并指定转换器:
@NotNull(message = "userRole should not be blank") @CsvBindByName(converter = UserRoleConverter.class) private UserRole userRole;
原有的CSV导出代码无需修改,运行后即可导出student/teacher格式的枚举值。
方案二:重写枚举的toString()方法
如果你的枚举在其他业务场景不需要默认的toString()返回枚举名,可以直接重写枚举的toString()方法:
@Getter @RequiredArgsConstructor public enum UserRole { STUDENT("student"), TEACHER("teacher"); private final String value; @Override public String toString() { return value; } }
这种方式不需要修改Bean和导出代码,OpenCSV默认会调用对象的toString()生成CSV内容,直接得到目标格式。
内容的提问来源于stack exchange,提问作者Gandalf
相关产品推荐
相关产品推荐

