restlet导出csv格式文件,以及restlet插件调用

本文介绍了如何在Restlet中导出CSV格式文件,重点讨论了Restlet处理CSV格式的限制及其解决方案。由于Restlet默认将对象解析到一行,无法满足多行CSV的需求。通过查阅资料,发现在GitHub上已有关于该问题的未解决Issue。作者参考他人建议,创建了一个JacksonRepresentation子类,覆盖createCsvSchema方法,并在META-INF/services下配置自定义的ConverterHelper来解决此问题。最后,提供了一个测试方法,以便在@Get注解中轻松导出CSV数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何用restlet导出csv格式文件,以及restlet插件的调用


由于业务需求,没有做成导出excel格式的,而是直接生成简平快的csv文件。

但是经过一番了解发现restlet关于csv格式的处理是有问题的。

http://stackoverflow.com/questions/24569318/writing-multi-line-csv-with-jacksonrepresentation

restlet只能把对象解析到一行上导出,要你何用。

https://github.com/restlet/restlet-framework-java/issues/928

上面的问题中有人提交了issue,但是官方已经标记为unplanned……只能自己动手了


提交issue的哥们给出的解决办法是实现一个JacksonRepresentation子类,让其覆盖createCsvSchema方法,在其中定义一个List,并指定转化的不是List,而是List中的实际需要的bean类型。

new JacksonRepresentation<List<MyBean>>(MediaType.TEXT_CSV, array) {
    @Override
    protected CsvSchema createCsvSchema(CsvMapper csvMapper) {
        return csvMapper.schemaFor(MyBean.class);
    }
}
但是这样有个问题,需要每次都将结果封装到这个类里返回才行,有没有办法能一劳永逸呢?


我想到的办法是继承JacksonRepresentation,和上面的方法相同,覆盖createCsvSchema方法

public class CorrectJacksonRepresentation<T> extends JacksonRepresentation<T> {

	private T object;
	
    public CorrectJacksonRepresentation(MediaType mediaType, T object) {
		super(mediaType, object);
		this.object = object;
	}

	@Override
    protected CsvSchema createCsvSchema(CsvMapper csvMapper) {
		if (!(object instanceof List)) {
			throw new IllegalArgumentException("accept java.util.List only");
		} else if (((List<?>)object).size() == 0) {				
			return csvMapper.schemaFor(Object.class);
		} else {
			return csvMapper.schemaFor(((List<?>)object).get(0).getClass());
		}
    }

}
通过查看jackson包的源码,可以看到JacksonRepresentation是在ConverterHelper调用的,所以还需要一个继承ConverterHelper的子类来调用我们自己实现的JacksonRepresentation。

那么jackson和restlet又如何知道要用我们实现的这个ConverterHelper而不是jackson自己的呢?

可以模仿restlet插件的写法,在META-INF/services下新建org.restlet.engine.converter.ConverterHelper,然后在其中添加上自己实现的这个ConverterHelper

写一个方法测试下

	@Get("csv")
	public List<KV> getWhat() {
		List<KV> result = new ArrayList<>();
		result.add(new KV("f43", null));
		result.add(new KV("f43", ""));
		result.add(new KV("", "34tg"));
		return result;
	}
调用后成功生成了多行的csv文件。

这样以后都只需要在@Get中加入("csv")就可以轻松导出数据了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值