我的JAXB层次结构中有一个域对象,该域对象必须表示为逗号分隔的值文本。不幸的是,显式构造CSV String
的成本非常高,因此不是一种选择。
我创建了一个自定义的@XmlJavaTypeAdapter
,它返回了一个DataHandler
(按照supported data types的定义),但是始终将数据写到BASE64中……但是我保留了一个遗留API,希望在那里能找到ASCII字符串。更改DataHandler
的MIME不会更改编码,但是会影响XSD对其中包含的对象的定义。
有什么方法可以设置DataHandler
(或任何其他受支持的Java类型)以从流输入返回未编码的String
?
我还考虑过返回一个Object
(实际上是一个CharacterData
),但这需要实现public String getData()
...要求我显式构造要尝试流式传输的String
。
最佳答案
如果没有人提出与DataHanler
相关的解决方案...以下只是不涉及DataHandler
的“替代方法”的另一种想法。它需要访问编组器。
修改您的XML类型适配器,使其不返回内容,而是一种简短的地址以保留流数据(例如,文件名)。
定义XMLStreamWriter包装器,如下所示:JAXB marshalling XMPP stanzas。覆盖writeStartElement
和writeCharacters
以拦截CSV元素和紧随其后的startElement
的writeCharacters
调用。
传递给writeCharacters
的特定调用的数据将成为获取流数据的地址。将其分块传输到包装的XMLStreamWriter的writeCharacters。