如何通过BeanELResolver正确解析名称

时间:2014-02-26 12:04:38

标签: java jsp resolver

我们必须使用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)at at   javax.el.BeanELResolver.getValue(BeanELResolver.java:281)at at   javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175)     在com.sun.el.parser.AstValue.getValue(AstValue.java:138)at   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中这种命名约定的规则是什么?

1 个答案:

答案 0 :(得分: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());
    }
  }
}

那就是说,之前这个地区存在漏洞。