Rozważmy następujący interfejs:„Własność Nie znaleziono typu” przy użyciu metody Interfejsu w JSP EL
public interface I {
default String getProperty() {
return "...";
}
}
i klasę wykonawczą, która po prostu ponownie wykorzystuje realizację domyślnie:
public final class C implements I {
// empty
}
Gdy wystąpi instancja C
w kontekście skryptowania JSP EL:
<jsp:useBean id = "c" class = "com.example.C" scope = "request"/>
${c.property}
- Otrzymuję PropertyNotFoundException
:
javax.el.PropertyNotFoundException: Property 'property' not found on type com.example.C
javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:268)
javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:221)
javax.el.BeanELResolver.property(BeanELResolver.java:355)
javax.el.BeanELResolver.getValue(BeanELResolver.java:95)
org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
org.apache.el.parser.AstValue.getValue(AstValue.java:169)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:943)
org.apache.jsp.index_jsp._jspService(index_jsp.java:225)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Mój początkowy pomysł Tomcat 6.0 był zbyt stary na Java 1.8 funkcje, ale byłem zaskoczony, aby zobaczyć Tomcat 8.0 jest również ograniczona. Oczywiście mogę pracować kwestię wokół dzwoniąc domyślna implementacja wyraźnie:
@Override
public String getProperty() {
return I.super.getProperty();
}
- ale dlaczego na ziemi metoda domyślna może być problem dla Tomcat?
Aktualizuj: dalsze badania ujawnia właściwości domyślnych nie można znaleźć, podczas gdy metody domyślne mogą, więc kolejny obejście (Tomcat 7+) wynosi:
<jsp:useBean id = "c" class = "com.example.C" scope = "request"/>
<%-- ${c.property} --%>
${c.getProperty()}
Moje przypuszczenie jest introspekcja nie działa z metod standardowych interfejsów? Naprawdę interesuje mnie odpowiedź :) –
Czy próbowałeś dodać adnotację @FunctionalInterface? – rickz
@rickz: nie, nie zrobiłem tego, z dwóch powodów: ** 1 ** IRL, mój interfejs ma więcej niż jedną metodę (w związku z tym nie kwalifikuje się do adnotacji), a ** 2 ** '@ FunctionalInterface' ma inny zakres (prawie nigdy nie używany razem z "domyślnymi" metodami): zwykle brak domyślnej implementacji i wiele anonimowych. Mam już dość IntelliJ IDEA grzecznie przypominając, że powinienem opisywać interfejs z '@ FunctionalInterface' za każdym razem, gdy zdarza mi się deklarować jednokierunkowy interfejs =) – Bass