前提・実現したいこと
textareaから入力された改行を含む文字列をDBに改行コード入りで格納して、
改行された状態で別ページでth:textとして表示したいです。
入力フォームから改行されて登録された値をCSV出力したところ、改行コード\nが入っていました。
が、DBViwerで中身を見ると何も改行コードがありません。
また、入力フォームのtextareaで既存データを表示する際は改行されて表示されます。
利用しているDBはMySQlです。
表示したいページではThymeleafで改行を記述する方法Thymeleafで文字列の改行コードを<br />に変換して出力するを試したらエラーが起きてしまいました。
何もせずth:textとして表示するとなぜか改行でなくスペースで表示されます。
発生している問題・エラーメッセージ
エラーメッセージ(表示したいページ) Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method split(java.lang.String,java.lang.Integer) cannot be found on type jp.co.itc.mbo.entity.CoGoal Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "cogoal.split('\r\n|\r|\n', -1)" (template: "goals/goal_list" - line 32, col 17)
該当のソースコード
cogoal.html(入力ページ)
HTML
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<meta charset="UTF-8"> 5<title>会社目標編集</title> 6</head> 7<body> 8 <h1>会社目標編集</h1> 9 10 <form method="post" th:action="@{/cogoal/complete}"> 11 <table> 12 <tr> 13 <th>年度</th> 14 <th>会社目標</th> 15 </tr> 16 17 <tr th:object="${cogoal}"> 18 <td> 19 <p th:text="*{year}"></p> <input type="hidden" name="year" 20 th:value="*{year}"> 21 </td> 22 <td><textarea name="cogoal" th:field="*{cogoal}" cols="40" 23 rows="8" required wrap="hard"></textarea></td> 24 <tr> 25 </table> 26 27 <br> <input type="submit" value="更新" /> 28 </form> 29 <div class=return> 30 <button onclick="location.href='/admin/menu'">戻る</button> 31 </div> 32</body> 33</html>
Controller(入力ページ)
java
1@RequestMapping("admin/cogoalinput") 2 public String coGoalInput(Model model) { 3 //既存目標の表示 4 CoGoal cogoal = cogoalservice.findCurrent(); 5 if(cogoal==null) { 6 return "admins/cogoal_new"; 7 } 8 model.addAttribute("cogoal", cogoal); 9 10 return "admins/cogoal"; 11 12 } 13@RequestMapping(path = "/cogoal/complete", method = RequestMethod.POST) 14 public String createCoGoal(Principal principal, CoGoalForm cogoalform) { 15 16 //今ログインしている人のID 17 Authentication auth = (Authentication) principal; 18 UserMaster loginuser = (UserMaster) auth.getPrincipal(); 19 //時間取ってくる 20 Timestamp timestamp = new Timestamp(System.currentTimeMillis()); 21 //既存目標のdelete_flgをtrueにする 22 CoGoal cogoalold = cogoalservice.findCurrent(); 23 cogoalold.setDeleteflg(true); 24 cogoalold.setUpdatedat(timestamp); 25 cogoalold.setUpdatedby(loginuser.getId()); 26 cogoalservice.save(cogoalold); 27 //新規目標作成 28 CoGoal cogoal = new CoGoal(); 29 cogoal.setYear(cogoalform.getYear()); 30 cogoal.setCogoal(cogoalform.getCogoal()); 31 cogoal.setCreatedat(timestamp); 32 cogoal.setDeleteflg(false); 33 cogoal.setUpdatedat(timestamp); 34 cogoal.setUpdatedby(loginuser.getId()); 35 cogoalservice.save(cogoal); 36 37 return "redirect:/admin/cogoalinput"; 38 39 }
goal_list.html(表示したいページ)
HTML
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org" th:fragment=""> 3<head> 4<meta charset="UTF-8"> 5<title>目標一覧</title> 6<link th:href="@{/css/style.css}" rel="stylesheet" /> 7<script th:src="@{/js/mboapp.js}" type="text/javascript"></script> 8</head> 9<body> 10 <h1>会社目標一覧</h1> 11 12 <table> 13 <tr> 14 <th>年度</th> 15 <th>会社目標</th> 16 <th>部目標</th> 17 <th>チーム目標</th> 18 </tr> 19 <tr> 20 <!-- th:object 1行分取ってくる --> 21 <td> 22 <p th:if="${cogoal}" th:text="${cogoal.year}"></p> 23 <p th:if="${cogoal} == null">設定されてません</p> 24 </td> 25 <td> 26 <p> 27 <th:block th:if="${cogoal}"> 28 <!-- ヌルポ対策 --> 29 <th:block th:each="line: ${cogoal.split('\r\n|\r|\n', -1)}"> 30 <!-- 改行コードでsplitしてループ --> 31 <th:block th:text="${line}" /> 32 <br /> 33 </th:block> 34 </th:block> 35 </p> 36 <p th:if="${cogoal} == null">設定されていません</p> 37 </td> 38 39 40 <td><p th:if="${deptgoal}" th:text="${deptgoal.deptgoal}"></p> 41 <p th:if="${deptgoal} == null">設定されていません</p></td> 42 <!-- <td th:text="${deptgoal.deptgoal}"></td>--> 43 <td> 44 <p th:if="${teamgoal}" th:text="${teamgoal.teamgoal}"></p> 45 <p th:if="${teamgoal} == null">設定されていません</p> 46 </td> 47 <!-- <td th:text="${teamgoal.teamgoal}"></td> --> 48 </tr> 49 </table> 50</body> 51</html>
Controller(表示したいページ)
java
1@RequestMapping("/{id}") 2 public String showGoal(@PathVariable Integer id, Model model) { 3 4 //ユーザ情報の取得 5 UserMaster usermaster = usermasterservice.findOne(id); 6 model.addAttribute("userid", usermaster); 7 8 //会社目標を表示するメソッド 9 CoGoal cogoal = cogoalservice.findCurrent(); 10 model.addAttribute("cogoal", cogoal); 11 12 //部目標を表示するメソッド 13 DeptMaster userdeptid = usermaster.getDeptid(); 14 DeptGoal deptgoal = deptgoalservice.findCurrentOne(userdeptid.getId()); 15 model.addAttribute("deptgoal", deptgoal); 16 17 //チーム目標を表示するメソッド 18 TeamMaster userteamid = usermaster.getTeamid(); 19 TeamGoal teamgoal = teamgoalservice.findCurrentOne(userteamid.getId()); 20 model.addAttribute("teamgoal", teamgoal); 21 22 return "goals/goal_list"; 23 } 24
試したこと
・表示したいページのタイプをpタグでなくtextareaで囲んだ→値が空白になってしまった
・DBに直接改行コードを書き込んだ→文字列としてみなされてしまった
追記
①thymeleafで以下のようなコードを書いて試しましたがスペースで表示されるのは変わりませんでした。
そもそもDBのデータに\nが入っていないので反応なし。そこで、DBに直で\nを打ち込んだらやはりスペースで表示されました。  の代わりに<br/>を入れたら文字列として認識されました。
HTML
1<td th:text="*{#strings.replace(cogoal, '\n', '  ')}" ></td>
②java側で文字列の変換を試みましたがObject型とString型の不一致でHTMLに値が渡りませんでした。
java
1 CoGoal cocogoal = cogoalservice.findCurrent(); 2 String cogoal1=cocogoal.toString(); 3 String cogoal=cogoal1.replace("\n", " "); 4 model.addAttribute("cogoal", cogoal);
補足情報(FW/ツールのバージョンなど)
何時間調べてもわからず本当に困っています。
初心者で至らないところがあると思いますがよろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー