Как заставить конвертер сообщений Spring boot CSV отображать встроенный CSV и не загружать его при использовании браузера - PullRequest
0 голосов
/ 03 ноября 2019

Я создал весенний стартовый проект в Eclipse. Большая часть кода была по этой ссылке https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/csv-msg-converter.html.

Я добавил конфигурацию согласования содержимого, чтобы принимать заголовки, расширение пути и параметры. Он прекрасно работает с почтальоном.

Но когда я пытаюсь в браузере http://localhost:8080/employeelist.csv. Во всех случаях CSV загружается в файл. Я хочу, чтобы он отображался в браузере. Я пытался установить расположение содержимого как встроенное в запросе сопоставления, заголовке выходного сообщения http, но CSV по-прежнему загружается.

Что мне делать, чтобы csv отображался в строке? Ранее я успешно отображал встроенный CSV в браузере, используя отдельный метод сопоставления запросов для CSV и заставляя метод возвращать void и принимать httpservletresponse в качестве параметра. Но я хочу использовать согласование контента и единый метод для всех форматов - XML, CSV, json. Какой бы формат не был выбран, он должен отображаться в браузере.

Возможно ли это?

Большое спасибо за ваше время.

Обновление: добавлены части кода, которые были отредактированы

package ti.projects;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.http.MediaType;

import org.springframework.http.converter.HttpMessageConverter;

import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;

import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.List;

@SuppressWarnings("deprecation")

@EnableWebMvc

@Configuration

@ComponentScan("ti.projects")

public class AppConfig extends WebMvcConfigurerAdapter {

       @Override

       public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

              converters.add(new CsvHttpMessageConverter<>());

       }

       public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {

       configurer.favorPathExtension(true).favorParameter(true).parameterName("mediaType").ignoreAcceptHeader(false)

                           .useJaf(false).mediaType("json", MediaType.APPLICATION_JSON)

                           .mediaType("csv", new MediaType("text", "csv"));

       }

}

package ti.projects;



import org.springframework.http.HttpStatus;

import org.springframework.http.MediaType;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.ResponseStatus;



import java.util.Arrays;

import java.util.List;



@Controller

public class ExampleController {



    @RequestMapping(

              value = "/newEmployee",

              consumes = "text/csv",

              produces = MediaType.TEXT_PLAIN_VALUE,

              method = RequestMethod.POST)

    @ResponseBody

    @ResponseStatus(HttpStatus.OK)

    public String handleRequest (@RequestBody EmployeeList employeeList) {

        System.out.printf("In handleRequest method, employeeList: %s%n", employeeList.getList());

        String s = String.format("size: " + employeeList.getList().size());

        System.out.println(s);

        return s;

    }



    @RequestMapping(

              value = "/employeeList",

              produces = {"text/csv", "application/json"},

              method = RequestMethod.GET

             )

    @ResponseBody

    @ResponseStatus(HttpStatus.OK)

    public EmployeeList handleRequest2 () {

        List<Employee> list = Arrays.asList(

                  new Employee("1", "Tina", "111-111-1111"),

                  new Employee("2", "John", "222-222-2222")

        );

        EmployeeList employeeList = new EmployeeList();

        employeeList.setList(list);

        return employeeList;

    }

}
package ti.projects;



import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;



@SpringBootApplication

public class ContentNegotiationApplication {



       public static void main(String[] args) {

              SpringApplication.run(ContentNegotiationApplication.class, args);

       }



}

1 Ответ

0 голосов
/ 03 ноября 2019

Браузер (должен) использовать предоставленный тип пантомимы, чтобы решить, как отобразить или обработать ответ. Что должно работать, так это использовать MIME text / plain, чтобы браузер отображал полученное содержимое в виде текста.

Вы можете установить тип MIME своего ответа в контроллере пружины следующим образом:

@GetMapping(produces = MediaType.TEXT_PLAIN_VALUE)
public String renderCsv() {...}

Если вы хотите предлагать разные типы MIME одним способом, у вас есть три варианта:

  1. Использовать параметр запроса (например, ...?contentType=json)
  2. Использовать параметр пути (например, .../{contentType})
  3. Использовать заголовок подтверждения клиента (предпочтительно?)

Вы можете зарегистрировать разные MessageConverter для каждого contentType и настроить ContentNegotiationConfigurer для автоматического выбора правильного конвертера в зависимости от типа MIME и ваших предпочтений.

Я попытаюсь прикрепитьпример сегодня вечером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...