如何使Spring MVC返回CSV像返回JSON一样方便 [英] How to make Spring MVC return CSV as convenient as return JSON

查看:118
本文介绍了如何使Spring MVC返回CSV像返回JSON一样方便的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道Spring MVC可以很容易地返回Json格式的模型;然而,我尝试了不同的方法来以CSV格式(通过Jackson)返回模型,但无法成功。



我应该怎么做?



我将模型代码,控制器代码和gradle.build附上:

非常感谢!



型号:

  @JsonPropertyOrder({staffName,name})
public class Greeter
{
String name;
String staffName [];

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public String [] getStaffName()
{
return staffName;
}

public void setStaffName(String [] staffName)
{
this.staffName = staffName;


$ / code $ / pre
$ b $ p

  @Controller 
public class GreetingController {

@RequestMapping(value =/ greeter / json,method = RequestMethod.GET )
public @ResponseBody
更好的getGreeterInJSON(){

更好的greeter = new Greeter();

greeter.setName(default);
greeter.setStaffName(new String [] {ye,lichi});

返回欢迎;


$ b @RequestMapping(value =/ greeter / csv,method = RequestMethod.GET,consumes =text / csv)
public @ResponseBody
Greeter getGreeterInCSV(HttpServletResponse响应){
欢迎greeter = new Greeter();

greeter.setName(default);
greeter.setStaffName(new String [] {ye,lichi});

CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(Greeter.class);

ObjectWriter writer = mapper.writer(schema.withLineSeparator(\\\
));

文件greeterCSV =新文件(greeterCSV.csv);

尝试{
writer.writeValue(greeterCSV,greeter);
} catch(JsonGenerationException e){
e.printStackTrace();
} catch(JsonMappingException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
返回欢迎词;


build.gradle相关性:

 依赖关系{
编译组:'commons-collections',名称:'commons-collections',版本:'3.2'

compile('org.springframework:spring-context:4.0.0.RELEASE')
compile(org.springframework.boot:spring-boot-starter-web:0.5.0.M6)
compile(org.thymeleaf:thymeleaf-spring3:2.0.17)

// compileorg.codehaus.jackson:jackson-mapper-asl:1.9.13
compile'c​​om.fasterxml.jackson.core:jackson-databind:2.3.0'
compile'c​​om.fasterxml.jackson.core:jackson-core:2.3.0'
compile'c​​om。 fasterxml.jackson.core:jackson-annotations:2.3.0'

compile'c​​om.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.3.0'

testCompile group:'junit',name:'junit',version:'4. +'
testCompileorg.mockito:mockito-all:1.9.5
}



编辑:




Tomcat错误:

HTTP状态415 -

类型状态报告

消息

<描述服务器拒绝了这个请求,因为请求实体的格式不被所请求资源的请求方法支持。

p>你不想消费,而是生产 csv。您的方式,服务期望输入以csv格式提供,这就是为什么它抱怨'请求实体是不支持的格式'。关键是'请求'在这里 - 它希望以csv格式输入一些内容。
将'消费'改为'生产'可以解决您的问题。


I know Spring MVC could return a model in format of Json easily; however, I have tried quite different approaches to return a model in CSV format (via Jackson), but could not make it successfully.

What should I do?

I enclose my model code, controller code, and gradle.build as following:

Thanks a lot!

Model:

@JsonPropertyOrder({ "staffName", "name" })
public class Greeter
{
    String name;
    String staffName[];

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String[] getStaffName()
    {
        return staffName;
    }

    public void setStaffName(String[] staffName)
    {
        this.staffName = staffName;
    }
}

Controller:

@Controller
public class GreetingController {

    @RequestMapping(value = "/greeter/json", method = RequestMethod.GET)
    public @ResponseBody
    Greeter getGreeterInJSON() {

        Greeter greeter = new Greeter();

        greeter.setName("default");
        greeter.setStaffName(new String[] { "ye", "lichi" });

        return greeter;

    }

    @RequestMapping(value = "/greeter/csv", method = RequestMethod.GET, consumes = "text/csv")
    public @ResponseBody
    Greeter getGreeterInCSV(HttpServletResponse response) {
        Greeter greeter = new Greeter();

        greeter.setName("default");
        greeter.setStaffName(new String[] { "ye", "lichi" });

        CsvMapper mapper = new CsvMapper();
        CsvSchema schema = mapper.schemaFor(Greeter.class);

        ObjectWriter writer = mapper.writer(schema.withLineSeparator("\n"));

        File greeterCSV = new File("greeterCSV.csv");

        try {
            writer.writeValue(greeterCSV, greeter);
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return greeter;
    }
}

build.gradle dependencies:

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'

    compile ('org.springframework:spring-context:4.0.0.RELEASE')
    compile("org.springframework.boot:spring-boot-starter-web:0.5.0.M6")
    compile("org.thymeleaf:thymeleaf-spring3:2.0.17")

    // compile "org.codehaus.jackson:jackson-mapper-asl:1.9.13"
    compile 'com.fasterxml.jackson.core:jackson-databind:2.3.0'
    compile 'com.fasterxml.jackson.core:jackson-core:2.3.0'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.3.0'

    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.3.0'

    testCompile group: 'junit', name: 'junit', version: '4.+'
    testCompile "org.mockito:mockito-all:1.9.5"
}

Edit:


Tomcat error:

HTTP Status 415 -

type Status report

message

description The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

解决方案

You want not to consume but produce csv. The way you have it, the service expects the input to be provided in csv format, that's why it complains about 'request entity is in a format not supported'. Key is 'request' here - it expects some input in csv format. Changing 'consume' to 'produces' should fix your problem.

这篇关于如何使Spring MVC返回CSV像返回JSON一样方便的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆