【问题标题】:How to initilize JAXB with SAX如何使用 SAX 初始化 JAXB
【发布时间】:2013-12-09 06:59:00
【问题描述】:

我正在尝试使用带有 SAX 的 JAXB 将 xml 解组为 java 对象。我在构造函数中写了这段代码。

logger.debug("Initializing jaxb...");
        try {
            jaxbContext = JAXBContext.newInstance(ProductInventory.class);
            jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            reader = saxParserFactory.newSAXParser().getXMLReader();
            EntityResolver entityResolver = new EntityResolver() {
                @Override
                public InputSource resolveEntity(String publicId,
                        String systemId) {
                    return new InputSource(new StringReader(""));
                }
            };
            reader.setEntityResolver(entityResolver);
            logger.debug("Successfully initialized jaxb.");
        } catch (JAXBException | SAXException | ParserConfigurationException e) {
            logger.error("Exception while initializing JAXB", e);
        }

当多个请求到来时reader对象有什么问题吗?我是否必须始终获得reader 的参考?我的意思是对于每个解组操作,我都必须获得一个新的 xml 阅读器吗?

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    将 SAX 与 JAXB 结合使用时,您使用的是 UnmarshallerHandler 而不是 Unmarshaller

    UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();
    reader.setContentHandler(unmarshallerHandler);
    reader.parse(xml);
    Foo foo = (Foo) unmarshallerHandler.getResult();
    

    UnmarshallerHandler 不是线程安全的,因此请确保您没有线程共享它。可以解析多个具有相同XMLReader的XML文档

    【讨论】:

    • 多个线程将访问相同的代码。那么我应该在本地声明 unmarshallerHandler 吗?我的意思是请求的方法
    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2012-01-16
    • 2011-12-04
    • 2011-03-25
    相关资源
    最近更新 更多