【发布时间】:2015-12-31 20:59:20
【问题描述】:
我有一个在 WildFly 10.0.0.CR5 容器中运行的 servlet。我正在向 servlet 发送一个包含 SOAPMessage 的 POST 请求,该请求在 servlet 中得到验证:
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 内部的一个问题......但我不确定从这里去哪里。请帮忙!!!!
【问题讨论】: