我必须重写一个非常大的旧应用程序(PROD)。为了检查我新编写的(微服务)应用程序是否按预期工作,我使用了旧应用程序的一些输出。这样,我就可以使用某种测试数据来测试我的新应用程序部件。但是,该旧应用程序会生成UTF-8格式的XML输出,但使用Win-CP1252编码的一个属性(有效负载)除外。 (旧版软件,不要问为什么)。
以下是原始消息:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<hist DatakindId="12356"
Id="68415"
ReceiveTime="Wed Aug 08 09:06:20 CEST 2018"
Retries="0"
token="foobar"
SendTime="Wed Aug 08 09:06:48 CEST 2018"
payload="# Fehler bei der Durchf[0xfc]hrung" <-- Actual (cannot use broken char in SO :-()
payload="# Fehler bei der Durchführung" <-- If it was in UTF-8
/>
使用杰克逊的XML-Mapper时,将导致以下异常:
com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 start byte 0xfc (at char #736, byte #53)
at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwAsParseException(StaxUtil.java:37)
at com.fasterxml.jackson.dataformat.xml.XmlFactory._initializeXmlReader(XmlFactory.java:657)
at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:593)
at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:29)
at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:857)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3091)
...
使用此数据类:
@JacksonXmlRootElement(localName = "hist")
public class Hist {
[...]
@JsonProperty("ReceiveTime")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "EEE MMM dd HH:mm:ss z yyyy", locale = "en")
public ZonedDateTime receiveTime;
@JsonProperty("payload")
public String payload;
}
所以我想:如果杰克逊无法解析,那就把它当作普通字节对待吧
private static final Charset PAYLOAD_CHARSET = Charset.forName("Cp1252");
public String payload;
@JsonProperty("payload")
public void setPayload(byte[] payload) {
this.payload = new String(payload, PAYLOAD_CHARSET);
}
但是,这导致杰克逊试图使用base64(?)来解码输入,从而导致以下异常:
Illegal character '#' (code 0x23) in base64 content
TLDR:我怎么能告诉Jackson我只想要有效载荷的字节而没有base64或任何其他编码?
有内置的东西吗?还是可以通过某种自定义解串器来实现?