2015-12-31 49 views
1

我有一個運行在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 -versionjavac -version,無一不是1.8.0_05。我嘗試創建一個Unmarshaller,並在將它發送到servlet之前,在我的客戶端代碼中以相同的方式設置事件處理程序,並且它工作正常。這讓我相信這是WildFly內的一個問題......但我不確定該從哪裏出發。請幫忙!!!!

回答

0

嗨,我不認爲ValidationEventHandler和Unmarshaller預計工作接受函數接口\λ表達式。我試着看看jar api和特定的實現。 jaxb-2.2.x

+0

爲什麼不接受lambda表達式?該方法需要一個'ValidationEventHandler',這是一個功能接口,對嗎?你能鏈接到一些顯示爲什麼你認爲不然的事嗎? –