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