Наконец-то я смог разобраться с этим, что теперь помогает мне передавать огромные данные из бэкэнда во Frontend, используя Spring 4.3.x , как упомянуто в моем посте. Ниже приведены рекомендации, которые помогут вам успешно выполнить программу.
Процедура, описанная ниже, настолько эффективна, что вы даже можете разбивать на страницы огромные данные на бэкэнде (например, hibernate, Mongo-java-driver, cassandra java driver и т. Д.) И продолжать потоковую передачу данных, пока ваша операция db не будет завершена. В некоторых областях, таких как производство, страхование, логистика и т. Д., Вам нужна такая утилита, в которой конечный пользователь ожидает от сервера больших объемов данных в форме CSV, JSON и т. Д. Для анализа необработанных данных.
Добавьте еще одну аннотацию @EnableWebMvc
над классом контроллера.
Когда вы добавляете вышеупомянутую аннотацию, код будет прерываться во время выполнения, вы можете увидеть в catalina.log
эту ошибку: java.lang.NoClassDefFoundError: com / fastxml / jackson / core / util / DefaultIndenter
Чтобы это исправить, вам нужно добавить ниже зависимость jar в ваш pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
Теперь добавьте <async-supported>true</async-supported>
в web.xml
под тегом <servlet>
, как показано ниже,
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
Ниже приведен код поддержки загрузки потокового файла и потока данных.
Код потока данных:
package com.emg.server.controller.rest;
import java.io.IOException;
import java.io.OutputStream;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
@Controller
@EnableWebMvc
public class StreamRecordsController {
@RequestMapping(value = "/streamrecords")
@ResponseBody
public StreamingResponseBody export() {
return new StreamingResponseBody() {
@Override
public void writeTo (OutputStream out) throws IOException {
for (int i = 0; i < 1000; i++) {
out.write((Integer.toString(i) + " - ")
.getBytes());
out.flush();
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
}
}
КОД ФАЙЛА:
package com.emg.server.controller.rest;
import java.io.File;
import java.nio.file.Files;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
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.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
@Controller
@EnableWebMvc
public class StreamRecordsController {
@RequestMapping(value = "/streamrecords", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
@ResponseBody
public ResponseEntity<StreamingResponseBody> export() {
File file = new File("C:\\Users\\Ankur\\sample.pdf");
StreamingResponseBody responseBody = outputStream -> {
Files.copy(file.toPath(), outputStream);
};
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=generic_file_name.pdf")
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(responseBody);
}
}
ВЫХОД для обоих потоковых стилей
ПРИМЕЧАНИЕ: Я выполняю обе программы по отдельности, разворачиваю и тестирую их отдельно.