【问题标题】:How to resolve the name properly by BeanELResolver如何通过 BeanELResolver 正确解析名称
【发布时间】:2014-03-29 05:55:49
【问题描述】:

我们必须在 Java 中使用一个非常特殊的类,它具有以下属性:

protected SPSExchangedDocumentType spsExchangedDocument;

public SPSExchangedDocumentType getSPSExchangedDocument() {
  return spsExchangedDocument;
}

我在 jsp 页面中使用该类的实例:

<c:out value = "${certificate.spsExchangedDocument.id.value}"/>

它抛出了以下异常:

javax.el.PropertyNotFoundException:类 'un.unece.uncefact.data.standard.spscertificate._5.SPSCertificateType' 没有属性“spsExchangedDocument”。在 javax.el.BeanELResolver.getBeanProperty(BeanELResolver.java:579) 在 javax.el.BeanELResolver.getValue(BeanELResolver.java:281) 在 javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) 在 com.sun.el.parser.AstValue.getValue(AstValue.java:138) 在 com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:206) 在 org.apache.jasper.runtime.PageContextImpl.evaluateExpression(PageContextImpl.java:1001)

我认为问题直接在于该属性称为spsExchangedDocument,但方法称为getSPSExchangedDocument。我无法更改类的代码,因为它是从 XSD 自动生成的,我们无法更改,所以我应该更改页面。但是我应该使用什么名称才能让 EL 正确解析它:

  • spsExchangedDocument.
  • SPSExchangedDocument。
  • sPSExchangedDocument。

在 java 和 EL 中这种命名约定的规则是什么?

【问题讨论】:

  • 一般情况下,getter 和 setter 的命名是属性名,首字母大写,以 get/set 开头。所以请尝试使用 getSpsExchangedDocument。通常这可以由您选择的 IDE 生成。
  • 再一次 - 我无法更改 getter 的名称,因为它是由 Jaxb 工具自动生成的。

标签: java jsp resolver


【解决方案1】:

假设BeanELResolver 实现符合the JavaBeans spec

8.8 推断名称的大写。

因此,当我们从中间提取属性或事件名称时 现有的 Java 名称,我们通常将第一个字符转换为小写 案子。但是,为了支持偶尔使用所有大写名称, 我们检查名称的前两个字符是否都是大写 如果是这样,别管它。比如,

  • “FooBah”变成“fooBah”
  • “Z”变成“z”
  • “网址”变为“网址”

java.beans API 将属性名称解析为SPSExchangedDocument

import java.beans.*;

public class Bean {
  public Object getSPSExchangedDocument() {
    return null;
  }

  public static void main(String[] args) throws IntrospectionException {
    BeanInfo info = Introspector.getBeanInfo(Bean.class);
    for (PropertyDescriptor prop : info.getPropertyDescriptors()) {
      System.out.println(prop.getName());
    }
  }
}

也就是说,这方面以前有过bug。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多