【问题标题】:EL syntax error: Expression cannot start with binary operatorEL 语法错误:表达式不能以二元运算符开头
【发布时间】:2012-09-01 08:52:25
【问题描述】:

有人对我如何解决此警告有任何创意吗?

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>

【问题讨论】:

  • 你是使用任何框架jsf还是只使用jstl\
  • 如何/何时评估 el 表达式?你把它包含在一个jsp页面中还是其他的?
  • 或者你只得到一个 Eclipse 警告并且在运行时表达式计算正确?
  • 还是不清楚。您收到 Eclipse 警告或 runtime 错误?
  • @dcernahoschi 日食警告

标签: java eclipse el


【解决方案1】:

您可以在方法中添加@SupressWarnings("el-syntax") 注释,Eclipse 将不再唠叨您。它会要求抑制未知的(对 Java 框架)抑制警告等。如果你不让它抑制,它会向注解添加警告。

.

但是通过在运行时构建 EL 表达式,您可以将应用程序暴露给 EL Injection

.

有人可以通过注入方法调用和东西在您的服务器上运行恶意代码。

检查EL中间的字符串的来源是否来自一个完全安全的来源,

sanitize your inputs 阻止它。

【讨论】:

    【解决方案2】:

    您的el 表达式虽然有效,但在运行时构造。但是 Eclipse 在开发/编译时会显示警告。因此,它现在可以在编译时检查在运行时返回 getId 的内容,以便正确验证 el 表达式。

    对于这种运行时构造的表达式,如果它们打扰您,您可以禁用来自 IDE 的警告。我个人不会禁用它们,所以他们会永远记住我,这是 el 表达式的特别之处。

    【讨论】:

      【解决方案3】:
      "#{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>
      

      请参考here(BalusC 的帖子“@ViewScoped 的好处和陷阱”)以获得完整的教程

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 2018-01-29
        • 2012-11-14
        相关资源
        最近更新 更多