كيفية حل الاسم بشكل صحيح عن طريق BeanELResolver
سؤال
يتعين علينا العمل مع فئة محددة جدًا في 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في javax.el.beanelresolver.getBeanProperty (Beanelresolver.java:579) في javax.el.beanelresolver.getvalue (beanelresolver.java:281) على javax.el.compositeelresolver.getvalue (compositeelver.java:175) على com.s. el.parser.astvalue.getValue (astvalue.java:138) في com.sun.el.valueExpressionImpl.getValue (valuexpressionimpl.java:206) على org.apache.jasper.runtime.pagecontextimpl.uitexpression
أعتقد أن المشكلة تكمن مباشرة في حقيقة أن العقار يسمى spsExchangedDocument, ولكن تسمى الطريقة getSPSExchangedDocument.لا أستطيع تغيير رمز الفصل، لأنه يتم إنشاؤه تلقائيًا من XSD، ولا يمكننا تغييره، لذا يجب أن أغير الصفحة.ولكن ما الاسم الذي يجب أن أستخدمه حتى تتمكن EL من حل المشكلة بشكل صحيح:
- spsExchangedDocument.
- SPSExchangedDocument.
- sPSExchangedDocument.
ما هي القاعدة لاصطلاحات التسمية هذه في Java و EL على أي حال؟
المحلول
على افتراض BeanELResolver
التنفيذ يتوافق مع مواصفات JavaBeans:
8.8 الكتابة بالأحرف الكبيرة للأسماء المستنتجة.
وبالتالي عندما نستخرج خاصية أو اسم الحدث من منتصف اسم Java الحالي ، عادةً ما نقوم بتحويل الحرف الأول إلى الحالة السفلية.ومع ذلك ، لدعم الاستخدام العرضي لجميع أسماء الحالات العلوية ، نتحقق مما إذا كان كلتا الحرفين الأولين من الاسم هما الحالة العليا ، وإذا كان الأمر كذلك ، فتجعله بمفرده.لذلك على سبيل المثال،
- "FooBah" يصبح "fooBah"
- "Z" يصبح "z"
- "URL" يصبح "URL"
ال جافا.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());
}
}
}
ومع ذلك، كانت هناك أخطاء في هذا المجال من قبل.