You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:04:58