【问题标题】:Cannot cast lambda expression to event handler无法将 lambda 表达式转换为事件处理程序
【发布时间】: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 -&gt; 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 -&gt; false 在这种情况下是有效的,但我不确定为什么它在 WildFly 容器中不起作用。提前感谢您的帮助。

编辑:我还要注意上面的Exception是由这个引起的:

java.lang.BootstrapMethodError: call site initialization exception

编辑:我还检查了 java -versionjavac -version,两者都是 1.8.0_05。我尝试创建一个Unmarshaller 并在我的客户端代码中以相同的方式设置事件处理程序,然后再将其发送到 servlet,它工作正常。这让我相信这是 WildFly 内部的一个问题......但我不确定从这里去哪里。请帮忙!!!!

【问题讨论】:

    标签: java lambda wildfly


    【解决方案1】:

    您好,我不认为 ValidationEventHandler 和 Unmarshaller 可以像预期的那样接受功能接口 \ λ 表达式。我试图查看 jar api 和具体实现。 jaxb-2.2.x

    【讨论】:

    • 为什么不接受 lambda 表达式?该方法接受ValidationEventHandler,这是一个功能接口,对吧?你能链接到一些说明你为什么不这么认为的东西吗?
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    相关资源
    最近更新 更多