我有一個運行在WildFly 10.0.0.CR5容器中的servlet。我發送包含SOAPMessage
到Servlet,這是在servlet中驗證的POST請求:無法將lambda表達式轉換爲事件處理程序
private void unmarshalXmlMsg(final Node node, final JAXBContext jaxbContext, final URL resourceUrl) {
try {
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(resourceUrl);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(schema);
unmarshaller.setEventHandler(e -> false);
Object unmarshalledObj;
String localName = node.getLocalName();
String classpath = CLASS_MAP.get(localName);
if (classpath == null) {
unmarshalledObj = unmarshaller.unmarshal(node);
} else {
unmarshalledObj = unmarshaller.unmarshal(node, Class.forName(classpath));
}
if (unmarshalledObj instanceof JAXBElement<?>) {
routeMessage((JAXBElement<?>) unmarshalledObj);
}
} catch (JAXBException | SAXException | ClassNotFoundException e) {
logger.error("Error unmarshalling xml from body of soapMessage", e);
}
}
一切都來自於罰款,但是當它到達unmarshaller.setEventHandler(e -> false);
,我得到以下Exception
:
java.lang.ClassCastException: Cannot cast
com.lmco.spacefence.incoming.service.IncomingMessageServlet$$Lambda$154/468475414
to javax.xml.bind.ValidationEventHandler
將其更改爲以下修正錯誤,以及其他一切執行罰款:
unmarshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent arg0) {
return false;
}
});
我知道e -> false
在這種情況下是有效的,但我不確定它爲什麼不能在WildFly容器中工作。預先感謝您的幫助。
編輯:我還要指出的是,上述Exception
是由這個原因引起:
java.lang.BootstrapMethodError: call site initialization exception
編輯:我還檢查java -version
和javac -version
,無一不是1.8.0_05。我嘗試創建一個Unmarshaller
,並在將它發送到servlet之前,在我的客戶端代碼中以相同的方式設置事件處理程序,並且它工作正常。這讓我相信這是WildFly內的一個問題......但我不確定該從哪裏出發。請幫忙!!!!
爲什麼不接受lambda表達式?該方法需要一個'ValidationEventHandler',這是一個功能接口,對嗎?你能鏈接到一些顯示爲什麼你認爲不然的事嗎? –