

## 前提・実現したいこと

textareaから入力された改行を含む文字列をDBに改行コード入りで格納して、  
改行された状態で別ページでth:textとして表示したいです。

入力フォームから改行されて登録された値をCSV出力したところ、改行コード\nが入っていました。  
また、入力フォームのtextareaで既存データを表示する際は改行されて表示されます。  
利用しているDBはMySQLです。

表示したいページではThymeleafで改行を記述する方法Thymeleafで文字列の改行コードを`<br
/>`に変換して出力するを試したらエラーが起きてしまいました。  
何もせずth:textとして表示するとなぜか改行でなくスペースで表示されます。

## エラーメッセージ

エラーメッセージ（表示したいページ)

[code]

    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)
    
[/code]

該当のソースコード  
cogoal.html(入力ページ）

[code]

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="UTF-8">
    <title>会社目標編集</title>
    </head>
    <body>
        <h1>会社目標編集</h1>
    
        <form method="post" th:action="@{/cogoal/complete}">
            <table>
                <tr>
                    <th>年度</th>
                    <th>会社目標</th>
                </tr>
    
                <tr th:object="${cogoal}">
                    <td>
                        <p th:text="*{year}"></p> <input type="hidden" name="year"
                        th:value="*{year}">
                    </td>
                    <td><textarea name="cogoal" th:field="*{cogoal}" cols="40"
                            rows="8" required wrap="hard"></textarea></td>
                <tr>
            </table>
    
            <br> <input type="submit" value="更新" />
        </form>
        <div class=return>
            <button onclick="location.href='/admin/menu'">戻る</button>
        </div>
    </body>
    </html>
    
[/code]

Controller（入力ページ）

[code]

    @RequestMapping("admin/cogoalinput")
        public String coGoalInput(Model model) {
            //既存目標の表示
            CoGoal cogoal = cogoalservice.findCurrent();
            if(cogoal==null) {
                return "admins/cogoal_new";
            }
            model.addAttribute("cogoal", cogoal);
    
            return "admins/cogoal";
    
        }
    @RequestMapping(path = "/cogoal/complete", method = RequestMethod.POST)
        public String createCoGoal(Principal principal, CoGoalForm cogoalform) {
    
            //今ログインしている人のID
            Authentication auth = (Authentication) principal;
            UserMaster loginuser = (UserMaster) auth.getPrincipal();
            //時間取ってくる
            Timestamp timestamp = new Timestamp(System.currentTimeMillis());
            //既存目標のdelete_flgをtrueにする
            CoGoal cogoalold = cogoalservice.findCurrent();
            cogoalold.setDeleteflg(true);
            cogoalold.setUpdatedat(timestamp);
            cogoalold.setUpdatedby(loginuser.getId());
            cogoalservice.save(cogoalold);
            //新規目標作成
            CoGoal cogoal = new CoGoal();
            cogoal.setYear(cogoalform.getYear());
            cogoal.setCogoal(cogoalform.getCogoal());
            cogoal.setCreatedat(timestamp);
            cogoal.setDeleteflg(false);
            cogoal.setUpdatedat(timestamp);
            cogoal.setUpdatedby(loginuser.getId());
            cogoalservice.save(cogoal);
    
            return "redirect:/admin/cogoalinput";
    
        }
    
[/code]

goal_list.html(表示したいページ）

[code]

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org" th:fragment="">
    <head>
    <meta charset="UTF-8">
    <title>目標一覧</title>
    <link th:href="@{/css/style.css}" rel="stylesheet" />
    <script th:src="@{/js/mboapp.js}" type="text/javascript"></script>
    </head>
    <body>
        <h1>会社目標一覧</h1>
    
        <table>
            <tr>
                <th>年度</th>
                <th>会社目標</th>
                <th>部目標</th>
                <th>チーム目標</th>
            </tr>
            <tr>
                <!-- th:object 1行分取ってくる -->
                <td>
                    <p th:if="${cogoal}" th:text="${cogoal.year}"></p>
                    <p th:if="${cogoal} == null">設定されてません</p>
                </td>
                <td>
                    <p>
                        <th:block th:if="${cogoal}">
                            <!-- ヌルポ対策 -->
                            <th:block th:each="line: ${cogoal.split('\r\n|\r|\n', -1)}">
                                <!-- 改行コードでsplitしてループ -->
                                <th:block th:text="${line}" />
                                <br />
                            </th:block>
                        </th:block>
                    </p>
                    <p th:if="${cogoal} == null">設定されていません</p>
                </td>
    
    
                <td><p th:if="${deptgoal}" th:text="${deptgoal.deptgoal}"></p>
                    <p th:if="${deptgoal} == null">設定されていません</p></td>
                <!--    <td th:text="${deptgoal.deptgoal}"></td>-->
                <td>
                    <p th:if="${teamgoal}" th:text="${teamgoal.teamgoal}"></p>
                    <p th:if="${teamgoal} == null">設定されていません</p>
                </td>
                <!--    <td th:text="${teamgoal.teamgoal}"></td> -->
            </tr>
        </table>
    </body>
    </html>
    
[/code]

Controller（表示したいページ）

[code]

    @RequestMapping("/{id}") 
        public String showGoal(@PathVariable Integer id, Model model) {
    
            //ユーザ情報の取得
            UserMaster usermaster = usermasterservice.findOne(id);
            model.addAttribute("userid", usermaster);
    
            //会社目標を表示するメソッド
            CoGoal cogoal = cogoalservice.findCurrent();
            model.addAttribute("cogoal", cogoal);
    
            //部目標を表示するメソッド
            DeptMaster userdeptid = usermaster.getDeptid();
            DeptGoal deptgoal = deptgoalservice.findCurrentOne(userdeptid.getId());
            model.addAttribute("deptgoal", deptgoal);
    
            //チーム目標を表示するメソッド
            TeamMaster userteamid = usermaster.getTeamid();
            TeamGoal teamgoal = teamgoalservice.findCurrentOne(userteamid.getId());
            model.addAttribute("teamgoal", teamgoal);
    
            return "goals/goal_list";
        }
    
    
[/code]

DBの中身(cogoal)[![画像の説明をここに入力](https://i.stack.imgur.com/9jqQE.png)](https://i.stack.imgur.com/9jqQE.png)

### 試したこと

・表示したいページのタイプをpタグでなくtextareaで囲んだ→値が空白になってしまった  
・DBに直接改行コードを書き込んだ→文字列としてみなされてしまった

### 補足情報（FW/ツールのバージョンなど）

何時間調べてもわからず本当に困っています。  
初心者で至らないところがあると思いますがよろしくお願いいたします。


CC BY-SA 4.0
2020-01-13T01:00:36.783
62197
2020-04-27T03:02:49.667
2020-04-27T03:02:49.667
2808
37431
question
spring-boot thymeleaf
SpringBoot Thymeleaf フォームから送信しDBに格納した値の改行コードがtextに反映されない


エラー内容から，「CogoalにsplitなんてMethodないよー」って言ってるので，しっかりString型を渡してあげたほうが良いかと思います．  
具体的には`<th:block th:each="line: ${cogoal.cogoal.split('\r\n|\r|\n',
-1)}">`とかにしてやれば良いのではないでしょうか？

また，HTMLでは改行を`<br>`タグで表現しているためこのような問題が起こりますが，確か`<pre>`タグで囲めば`\n`がそのまま反映されると思います．


CC BY-SA 4.0
2020-01-13T05:34:06.277
62200
2020-01-13T05:34:06.277
29506
62197
answer