2

この警告をどのように解決できるかについて、創造的なアイデアを持っている人はいますか?

EL 構文エラー: 式は二項演算子で開始できません

次のコードが原因です:

String.format("#{myController.deleteItemById(%d)}", getId())

私のコードは以前は次のように見えました:

"#{myController.deleteItemById(" + getId() + ")}"

しかし、これによりEclipseは次の警告を生成しました:

EL 構文エラー: 文字列が閉じられていません

アップデート:

@ManagedBean(name = "myController")
@ViewScoped
public class MyController implements Serializable {

  private long id;
  private HtmlPanelGroup panel;

  public long getId() {return this.id; }

  private void getPanel() {

  /// bunch of code for programatically creating a form

    HtmlCommandButton deleteButton = new HtmlCommandButton();
    deleteButton.setId(id);
    deleteButton.setValue(value);
    deleteButton.setActionExpression(/* EL expression used here */);
   }
}

<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <!-- some other elements removed for the sake of clarity -->      
    <h:body>
        <h:panelGroup binding="#{myController.panel}" />
    </h:body>
</html>
4

3 に答える 3

2

メソッドにa で注釈を付けることができ@SupressWarnings("el-syntax")、Eclipse はしつこくしなくなります。(Java フレームワークに対して) 不明な警告などを抑制するように求めます。抑制しない場合は、代わりに注釈に警告が追加されます。

.

しかし、実行時に EL 式を作成すると、アプリケーションがEL インジェクションにさらされます。

.

メソッド呼び出しなどを挿入することで、誰かがサーバー上で悪意のあるコードを実行する可能性があります。

ELの途中の文字列の原点が完全に安全な原点から来ているかどうかを確認し、

または入力をサニタイズしてそれを防ぎます。

于 2014-02-12T14:51:13.293 に答える
1

あなたのel式は有効ですが、実行時に構築されます。ただし、Eclipse は開発/コンパイル時に警告を表示します。getIdそのため、式を正しく検証するために、実行時に何が返されるかをコンパイル時にチェックする方法が用意されていelます。

このような実行時に構築された式の場合、IDE からの警告が気になる場合は無効にすることができます。私は個人的にそれらを無効にしないので、彼らはいつも私をそのel表現で特別なものとして覚えています.

于 2012-09-01T12:10:53.703 に答える
-1
"#{myController.deleteItemById(" + getId() + ")}"

このコードで私が理解しているのは、myController がマネージド Bean であり、deleteItemById がそのマネージド Bean に実装されているメソッドであるということです。メソッドを呼び出して、そのメソッドで必要なものを処理し、ID を取得し、必要に応じて CRUD 操作を実装します。それはデータテーブルにあり、次のように使用できるオブジェクトを送信したい:

           <h:dataTable value="#{bean.list}" var="item">
                <h:column><f:facet name="header">ID</f:facet>#{item.id}</h:column>
                <h:column><f:facet name="header">Value</f:facet>#{item.value}</h:column>
                <h:column><h:commandButton value="edit" action="#{bean.edit(item)}" /></h:column>
                <h:column><h:commandButton value="delete" action="#{bean.delete(item)}" /></h:column>
            </h:dataTable>

完全なチュートリアルについては、こちら(BalusC の投稿「@ViewScoped の利点と落とし穴」) を参照してください。

于 2012-09-01T09:06:29.270 に答える