Come risolvere il nome correttamente da BeanelResolver
Domanda
Dobbiamo lavorare con una classe molto specifica in Java che ha la seguente proprietà:
protected SPSExchangedDocumentType spsExchangedDocument;
public SPSExchangedDocumentType getSPSExchangedDocument() {
return spsExchangedDocument;
}
.
Io uso l'istanza di quella classe all'interno di una pagina JSP:
<c:out value = "${certificate.spsExchangedDocument.id.value}"/>
Mi genera la seguente eccezione:
.javax.el.propertynotfoundexception: la classe 'un.unece.uncefact.data.standard.sprscertificate._5.sprscertificateType' non ha la proprietà 'spsexchangeddocument'. a javax.el.beanelresolver.getbeanproperty (beayelresolver.java:579) a javax.el.beanelresolver.getValue (BeeleLresolver.java:281) a javax.el.compositeelresolver.getValue (compositeelresolver.java:175) al com.sun.el.parser.astvalue.getValue (ASTValue.java:138) a com.sun.el.valueexpressionimpl.getValue (Valueexpressionimpl.java:206) a org.apache.jasper.Runtime.PageContextimpl.eval IteredExpression (PageContextimpl.java:1001)
Penso che il problema sia direttamente con il fatto che la proprietà si chiama spsexchangeddocument , ma il metodo è chiamato getspsexchangeddocument . Non riesco a cambiare il codice della classe, perché è generato automaticamente da XSD, che non possiamo modificare, quindi dovrei cambiare la pagina. Ma quale nome dovrei usare per risolvere EL per risolverlo correttamente:
- .
- spsexchangeddocument.
- spsexchangeddocument.
- spsexchangeddocument.
Qual è la regola per tali convenzioni di denominazione in Java e El comunque?
Soluzione
Supponendo che l'implementazione BeanELResolver
sia conforme a i javabeans spec :
.8.8 Capitalizzazione dei nomi dedotti.
quindi quando estraggiamo un nome di proprietà o evento dal centro di un nome Java esistente, normalmente convertiamo il primo carattere per abbassare Astuccio. Tuttavia per supportare l'uso occasionale di tutti i nomi maiuscoli, Controlliamo se i primi due caratteri del nome sono entrambi maiuscoli E se così lascialo solo. Quindi, ad esempio,
the java.beans API Risolve il nome della proprietà come 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());
}
}
}
.