2015-12-31 47 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',这是一个功能接口,对吗?你能链接到一些显示为什么你认为不然的事吗? –