2

我们必须使用 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 正确解析它:

  • spsExchanged 文档。
  • SPSExchanged 文档。
  • sPSExchangedDocument。

无论如何,Java 和 EL 中这种命名约定的规则是什么?

4

1 回答 1

1

假设BeanELResolver实现符合JavaBeans 规范

8.8 推断名称的大写。

因此,当我们从现有 Java 名称的中间提取属性或事件名称时,我们通常将第一个字符转换为小写。然而,为了支持偶尔使用所有大写名称,我们检查名称的前两个字符是否都是大写的,如果是,则不处理。例如,

  • “FooBah”变成“fooBah”</li>
  • “Z”变成“z”</li>
  • “网址”变成了“网址”</li>

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());
    }
  }
}

就是说,以前在这方面有过错误。

于 2014-02-26T12:23:45.093 回答