Почему отсутствует возврат каретки? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть команда SQL, которая обновляет поле в таблицу и заполняет его на основе "cat file.txt".Этот файл состоит из множества строк, и я хотел бы позже добавить его в поле гибернации, но кажется, что после чтения его из db hibernate удалите все символы возврата каретки.

Это сценарий, который я выполняю из сценария оболочки (bash):

 REQUEST_FILE=`cat file.txt`
 echo "UPDATE table SET request_info='$REQUEST_FILE'  WHERE id=1;" > ./after.sql 

если я сделаю cat of after.sql, то получу:

 UPDATE table SET request_info='1-Start-Env Script for Env
 2-insert done
 3-update info done
 4-all performed correctly'  WHERE id=29;

это структура таблицы БД:

Table: table
Columns:
id int(11) AI PK 
submit_date datetime 
request_type varchar(45) 
request_info longtext

этоданные хранятся в БД и как строка:

# id, submit_date,request_type, request_info
'29', '2019-02-11 04:55:21', 'check', '1-Start-Env Script for Env\n2-insert done\n3-update info done\n4-all performed correctly'

Так что до этого шага, я думаю, все в порядке, так как поле содержит '\ n'

Класс Hibernate делается таким образом:

@Entity
@Table(name="table")
@NamedQuery(name="Table.findAll", query="SELECT u FROM Table u")
public class Table implements Serializable {
   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue
   private int id;

   @Column(name="request_info")
   private String requestInfo;

   @Column(name="request_type")
   private String requestType;

   @Temporal(TemporalType.TIMESTAMP)
   @Column(name="submit_date")
   private Date submitDate;

и когда я получаю доступ к переменной requestInfo, вывод будет:

1-Start-Env Сценарий для Env2-insert done3-update информация done4-all выполнено правильно

Эта переменная используется для создания файла после нажатия кнопки на странице JSF:

  HttpServletResponse response = (HttpServletResponse) 
  fc.getExternalContext().getResponse();

    response.reset();
    response.setContentType("text/plain");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

    OutputStream output = response.getOutputStream();

     output.write(request.getRequestInfo().getBytes());

    output.flush();
    output.close();

Если я сделаю System.out, я увижу правильные данные, тогда я думаю,если функция getBytes не возвращает возврат каретки:

         System.out.println("file content:" +request.getRequestInfo());

Вывод:

file content:1-Start-Env Script for Env 
2-insert done 
3-update info done 
4-all performed correctly

есть идеи?спасибо

1 Ответ

0 голосов
/ 12 февраля 2019

Ваша проблема - символ новой строки.

Вместо \n, используйте \r\n для новой строки в файле.

Однако это не решит проблему на всехплатформы, только ту, на которой вы тестируете.

Для получения дополнительной информации о новых строках и различных платформах см. здесь:

https://superuser.com/questions/374028/how-are-n-and-r-handled-differently-on-linux-and-windows

Вы также можете попробовать что-то вроде:

output.write(request.getRequestInfo().replaceAll("(\\\\r\\\\n|\\\\n)", "\\\n"));

Опять же, ваш сервлет не знает, на какой платформе установлен браузер (Windows, Mac или что-то еще), поэтому, если вы не собираетесь смотреть заголовок пользовательского агента илито, что у вас всегда будет проблема с одной или другой системой.

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