繁体   English   中英

Jaxb编组到错误的角色

[英]Jaxb marshalling to wrong character

我曾经通过调用toXml()来编组模型:

@XmlRootElement
public class MyModel {

    private String body;

    public String getBody() {
        return this.body;
    }

    public void setBody(final String _body) {
        this.body = _body;
    }

    public String toXML() throws JAXBException {
        final JAXBContext context = JAXBContext.newInstance(MyModel.class);
        final Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        final StringWriter writer = new StringWriter();
        marshaller.marshal(this, writer);
        return writer.toString();
    }
}

如果我写这个文件或通过流到WebDAV目标,它采用即当导致了无效的XML ä作为textvalue。

final MyModel m = new MyModel();
m.setBody("\u00E4");

final FileWriter w = new FileWriter("D:\\outtest.xml");
w.write(m.toXML());
w.close();

XMl是这样的(当切换到ansi时,在npp中看起来是其他并且在那里是正确的):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myModel><body>伯</body></myModel>

我需要一个提示来解决这个问题!


OK,这可以正常工作(谢谢!):

final MyModel m = new MyModel();
m.setBody("\u00E4");
final FileOutputStream s = new FileOutputStream("D:\\outtest.xml");
final OutputStreamWriter osw = new OutputStreamWriter(s, Charset.forName("UTF-8"));
osw.write(m.toXML());
osw.close();

我现在的问题是,此文件测试是简化版本;-)
我调用toXml()并将此字符串写为JPA-moodel。 稍后,应使用框架类将其写入webdav,该类将ByteArrayInputStream作为输入。 所以我用这段代码:

final ByteArrayInputStream stream = new ByteArrayInputStream(jpaModel.getXmlString().getBytes());

...然后写下来,我终于明白了。 使用“更详细的” getBytes(Charset.forName("UTF-8"))可以帮助我! 谢谢

好的,现在我们知道您如何编写文件,这就是问题所在:

FileWriter w = new FileWriter("D:\\outtest.xml");

这将始终使用平台默认编码-即使您已经告诉JAXB您将使用UTF-8。 有点像为JPEG创建数据,然后将其另存为.png文件。 使用使用UTF-8包装在OutputStreamWriterFileOutputStream ,一切都应该很好。

如果您使用的是Java 7,则可以简化以下操作:

try (Writer writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
    writer.write(m.toXML());
}

另外,您可能希望更改toXML方法以接受将数据写入其中的OutputStream ,而不是返回字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM