java.io.StreamCorruptedException: недопустимый заголовок потока: C2ACC3Ad
Я пытался передавать объекты между двумя контроллерами с помощью StreamingResponseBody. Все было довольно хорошо для меня, пока я не заметил, что передаю только обычную строку. Его байты отличаются от тех, которые я отправляю с конечной точки /send...
Я был бы очень рад, если бы вы могли помочь мне понять, что происходит.
Контроллер отправки:
...
@GetMapping(value="/send")
public ResponseEntity<StreamingResponseBody> send(){
List<Student> students = studentManager.getStudents();
StreamingResponseBody stream = outputStream -> {
for(Student student: students){
byte[] data = SerializationUtils.serialize(student);
outputStream.write(data);
outputStream.flush();
}
};
ResponseEntity.ok()
.contentType(MediaType.APPLICATION_STREAM_JSON)
.body(stream);
}
Другое приложение, метод приемника:
// code ommited
...
HttpHeaders headers = new HttpHeadres();
List<MediaType> mediaList = new ArrayList<>();
headers.setAccept(mediaList);
HttpEntity<Object> entity = new HttpEntity<>(null, headers)
ResponseEntity<String> response = new restTemplate.exchange("http://localhost:8080/send", HttpMethod.GET, entity, String.class);
byte[] bytes = response.getBody().getBytes();
Object responseObj = SerializationUtils.deserialize(bytes);
List<Object> objs = Arrays.asList(responseObj);
List<Student> students = new ArrayList<>();
for(Object o: objs){
students.add((Students)o);
}
...
1 ответ
Вы используете лямбду. У вас нет ни гарантии, что лямбда будет выполнена во времяsend()
метод, а также то, что используется один и тот же поток.
Поскольку транзакционный контекст, используемый Spring, хранится в локальной переменной потока, вы можете потерять этот транзакционный контекст. Если это сущность-экземпляр в транзакционном сеансеstudent
может быть больше не десериализован из базы данных.