12.

【Javaエラー】エンティティ" ... "への参照は';'デリミタで終了する必要があります。

編集
この記事の要点
  • エンティティ "..." への参照は ";" デリミタで終了する必要がありますXML / HTML / JSP で & 文字をエスケープしていない
  • 原因: & はエンティティ参照の開始文字なので、文字として使うには & にエスケープ必須
  • 対処: URL のクエリ区切り、SQL の AND 等で & をそのまま書いている箇所を &
  • JSP / XML の場合は で自動エスケープが安全

 

エラーの状況

XML エラー
エンティティ "page" への参照は ";" デリミタで終了する必要があります。

# または英語版
The reference to entity "page" must end with the ';' delimiter.

XML パーサがエンティティ参照(&...;)を期待した位置で、& の後に文字が続いて ; で終わらない、というエラー。HTML / JSP / XML / 設定ファイル等で発生します。

原因


  
  

結果: SELECT * FROM users WHERE active=true & deleted=false

XML パーサは & を見つけるとエンティティ参照の始まりと解釈します:

  • &&
  • <<
  • >>
  • ""
  • &#NNN; → 数値文字参照

これらの形式以外は不正と判定されてエラーになります。

対処方法

方法 1: & を & にエスケープ


  


SELECT * FROM users WHERE active=true & deleted=false

方法 2: JSP の c:out で自動エスケープ







    検索

方法 3: CDATA セクション


JSP での EL 式の自動エスケープ


<%@ page contentType="text/html;charset=UTF-8" %>


${userInput}

${fn:escapeXml(userInput)}

HTML の & エスケープ

HTML5 では「& + 既知のエンティティ名 + ;」以外の &そのまま許容されるのでブラウザ表示は壊れません。しかしXML として処理する場面(XHTML / SVG / XML 出力)では厳格にエラーになります。


  



  


サーバサイドでの自動エスケープ

Spring / Thymeleaf


プレースホルダ

プレースホルダ

Laravel Blade


{{ $userInput }}

{!! $trustedHtml !!}

React / Vue

// React は自動エスケープ

{userInput}

// &, <, > 自動エスケープ

// 危険 // Vue

{{ userInput }}

// 自動エスケープ

// 危険

設定ファイル(XML)でのエスケープ


http://example.com/?a=1&b=2



    jdbc/Pool&1




    https://example.com?a=1&b=2

JSON では & はそのままで OK

JSON は XML ではないので、& のエスケープは不要:

// JSON
{"url": "/search?q=hello&page=2"}  // OK

// ただし JSON を HTML に埋め込む際は HTML 側でエスケープが必要

関連エラー

  • The content of elements must consist of well-formed character data: <> をエスケープしていない
  • XML document structures must start and end within the same entity: タグ開閉不一致
  • Premature end of file: XML が途中で終わっている

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. java.lang.NoSuchMethodError
  2. java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
  3. java.lang.UnsupportedClassVersionError
  4. version less than X.X is not supported.
  5. パッケージ~は存在しません
  6. org.apache.jasper.JasperException: ...The jsp:param action must not be...
  7. java.io.FileNotFoundException: ファイル名 (許可がありません)
  8. java.sql.SQLException: Cannot convert value 'YYYY-MM-DD ...' from column n(YYYY-MM-DD ...) to TIMESTAMP.
  9. 警告: この文字は、エンコーディング[文字コード]にマップできません
  10. java.text.ParseException: Unparseable date
  11. Unsupported major.minor version 52.0
  12. エンティティ" ... "への参照は';'デリミタで終了する必要があります。
  13. java.math.BigDecimal cannot be cast to java.lang.String