栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使Spring Controller从POJO返回CSV?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使Spring Controller从POJO返回CSV?

基于另一个问题,我为Tsv响应做了自己的HTTPMessageConverter。

TsvMessageConverter.java

public class TsvMessageConverter extends AbstractHttpMessageConverter<TsvResponse> {    public static final MediaType MEDIA_TYPE = new MediaType("text", "tsv", Charset.forName("utf-8"));    private static final Logger logger = LoggerFactory.getLogger(TsvMessageConverter.class);    public TsvMessageConverter() {        super(MEDIA_TYPE);    }    protected boolean supports(Class<?> clazz) {        return TsvResponse.class.equals(clazz);    }    @Override    protected TsvResponse readInternal(Class<? extends TsvResponse> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {        return null;    }    protected void writeInternal(TsvResponse tsvResponse, HttpOutputMessage output) throws IOException, HttpMessageNotWritableException {        output.getHeaders().setContentType(MEDIA_TYPE);        output.getHeaders().set("Content-Disposition", "attachment; filename="" + tsvResponse.getFilename() + """);        final OutputStream out = output.getBody();        writeColumnTitles(tsvResponse, out);        if (tsvResponse.getRecords() != null && tsvResponse.getRecords().size() != 0) { writeRecords(tsvResponse, out);        }        out.close();    }    private void writeRecords(TsvResponse response, OutputStream out) throws IOException {        List<String> getters = getObjectGetters(response);        for (final Object record : response.getRecords()) { for (String getter : getters) {     try {         Method method = ReflectionUtils.findMethod(record.getClass(), getter);         out.write(method.invoke(record).toString().getBytes(Charset.forName("utf-8")));         out.write('t');     } catch (IllegalAccessException | InvocationTargetException e) {         logger.error("Erro ao transformar em CSV", e);     } } out.write('n');        }    }    private List<String> getObjectGetters(TsvResponse response) {        List<String> getters = new ArrayList<>();        for (Method method : ReflectionUtils.getAllDeclaredMethods(response.getRecords().get(0).getClass())) { String methodName = method.getName(); if (methodName.startsWith("get") && !methodName.equals("getClass")) {     getters.add(methodName); }        }        sort(getters);        return getters;    }    private void writeColumnTitles(TsvResponse response, OutputStream out) throws IOException {        for (String columnTitle : response.getColumnTitles()) { out.write(columnTitle.getBytes()); out.write('t');        }        out.write('n');    }}

TsvResponse.java

public class TsvResponse {   private final String filename;   private final List records;    private final String[] columnTitles;   public TsvResponse(List records, String filename, String ... columnTitles) {       this.records = records;       this.filename = filename;       this.columnTitles = columnTitles;   }   public String getFilename() {       return filename;   }   public List getRecords() {       return records;   }    public String[] getColumnTitles() {        return columnTitles;    }}

然后在SpringContext.xml上添加以下内容:

<mvc:annotation-driven>        <mvc:message-converters register-defaults="true"> <bean />        </mvc:message-converters>    </mvc:annotation-driven>

因此,您可以像这样在控制器上使用:

@RequestMapping(value="/tsv", method= RequestMethod.GET, produces = "text/tsv")    @ResponseBody    public TsvResponse tsv() {        return new TsvResponse(myListOfPojos, "fileName.tsv",     "Name", "Email", "Phone", "Mobile");    }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/417141.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号