手动创建PMML 4.4时遇JAXB UnmarshalException异常求助
问题解决:PMML 4.4 JAXB解组异常
异常根源
你的代码存在两个核心问题:
- 命名空间感知被关闭:设置
XMLInputFactory.IS_NAMESPACE_AWARE为false,导致XML解析器忽略XML中的命名空间信息,JAXB无法匹配到对应版本的PMML绑定类。 - 命名空间URI不匹配:XML中声明的命名空间是
http://www.dmg.org/PMML-4_4,但PMML 4.4的JAXB绑定类实际关联的是https://www.dmg.org/PMML-4_4(从异常信息里的{https://www.dmg.org/PMML-4_4}AR可验证),HTTP与HTTPS的差异导致类绑定失败。
修正方案
1. 开启命名空间感知
直接移除xif.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);这行代码(XMLInputFactory默认就是命名空间感知的),或者显式设置为true。
2. 修正XML中的命名空间URI
将XML里的xmlns="http://www.dmg.org/PMML-4_4"改为xmlns="https://www.dmg.org/PMML-4_4"。
修正后的完整代码
String pmmlString="<?xml version=\"1.0\" encoding=\"UTF-8\"?><PMML xmlns=\"https://www.dmg.org/PMML-4_4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"4.4\"></PMML>"; PMML pmml = null; XMLStreamReader xsr = null; try { JAXBContext jc = JAXBContext.newInstance(PMML.class); Unmarshaller u = jc.createUnmarshaller(); XMLInputFactory xif = XMLInputFactory.newInstance(); // 移除IS_NAMESPACE_AWARE=false的设置,保持默认的命名空间感知 xif.setProperty(XMLInputFactory.IS_COALESCING, false); xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); xsr = xif.createXMLStreamReader(new ByteArrayInputStream(pmmlString.getBytes())); pmml = (PMML) u.unmarshal(xsr); } catch(Exception e){ e.printStackTrace(); } finally { if (xsr != null) { try { xsr.close(); } catch (Exception e) { // 忽略关闭异常 } } }
补充说明
PMML 4.4版本的命名空间协议头从HTTP升级为HTTPS,这是版本迭代后的变更点,必须严格匹配URI才能让JAXB完成正确的类绑定。
内容的提问来源于stack exchange,提问作者Abhishek B A
相关产品推荐
相关产品推荐

