多个 Jackson XML 自定义 (XMLStreamWriter) 序列化程序抛出异常

2023-12-13

如果有多个自定义 XML 序列化程序(XMLStreamWriter) 在类中,序列化失败。

我有两节课:CustomClass1, CustomClass2。有一个包装类TestJacksonXml1。当我尝试序列化时TestJacksonXml1,它会抛出异常。

定制类1

class CustomClass1 {
    int prop1;

    public CustomClass1(int prop1) {
        this.prop1 = prop1;
    }

    public int getProp1() {
        return prop1;
    }

    static class CustomClass1Serializer extends StdSerializer<CustomClass1> {
        public CustomClass1Serializer() { this(null); }

        public CustomClass1Serializer(Class<CustomClass1> t) {
            super(t);
        }

        @Override
        public void serialize(CustomClass1 customClass1, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            final ToXmlGenerator toXmlGenerator = (ToXmlGenerator) jsonGenerator;
            final XMLStreamWriter staxWriter = (toXmlGenerator).getStaxWriter();
            try {
                staxWriter.writeStartElement("class1");
                staxWriter.writeCharacters(String.valueOf(customClass1.prop1));
                staxWriter.writeEndElement();
            } catch (XMLStreamException e){
                e.printStackTrace();
            }
        }
    }
}

定制类2

class CustomClass2 {
        int prop2;

        public CustomClass2(int prop2) {
            this.prop2 = prop2;
        }

        public int getProp2() {
            return prop2;
        }

        static class CustomClass2Serializer extends StdSerializer<CustomClass2> {
            public CustomClass2Serializer() { this(null); }

            public CustomClass2Serializer(Class<CustomClass2> t) {
                super(t);
            }

            @Override
            public void serialize(CustomClass2 customClass2, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                final ToXmlGenerator toXmlGenerator = (ToXmlGenerator) jsonGenerator;
                final XMLStreamWriter staxWriter = (toXmlGenerator).getStaxWriter();
                try {
                    staxWriter.writeStartElement("class2");
                    staxWriter.writeCharacters(String.valueOf(customClass2.prop2));
                    staxWriter.writeEndElement();
                } catch (XMLStreamException e){
                    e.printStackTrace();
                }
            }
        }
    }

封闭类

public class TestJacksonXml1 {
    @JsonSerialize(using = CustomClass1.CustomClass1Serializer.class)
    CustomClass1 obj1;

    @JsonSerialize(using = CustomClass2.CustomClass2Serializer.class)
    CustomClass2 obj2;

    public TestJacksonXml1(CustomClass1 obj1, CustomClass2 obj2) {
        this.obj1 = obj1;
        this.obj2 = obj2;
    }

    public CustomClass1 getObj1() {
        return obj1;
    }

    public CustomClass2 getObj2() {
        return obj2;
    }

    public static void main(String[] args) throws JsonProcessingException {
        XmlMapper xmlMapper = new XmlMapper();
        System.out.println(xmlMapper.writeValueAsString(new TestJacksonXml1(new CustomClass1(10), new CustomClass2(20))));
    }
}

我得到的例外是

Exception in thread "main" com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value
    at com.fasterxml.jackson.core.JsonGenerator._reportError(JsonGenerator.java:1961)
    at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeFieldName(ToXmlGenerator.java:435)
    at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeFieldName(ToXmlGenerator.java:577)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:725)
    at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializerBase.serializeFields(XmlBeanSerializerBase.java:202)
    at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializer.serialize(XmlBeanSerializer.java:117)
    at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:107)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3905)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3219)
    at fk.reportsvc.common.TestJacksonXml1.main(TestJacksonXml1.java:39)

当我注释掉其中一个自定义序列化器时,另一个可以工作。为什么会这样呢?

我们不应该使用两个/多个自定义序列化器(带有XMLStreamWriter)立刻?

如果我使用JsonGenerator直接代替XMLStreamWriter,那么我就可以同时使用两个自定义序列化器。

PS:我的实际业务类包含许多要转换为嵌套 XML 元素和属性的字段。因此更喜欢XMLStreamWriter直接凌驾于他人之上。


更简单的是使用以下方法ToXmlGenerator班级。看一眼:设置下一个名称, writeRaw and 写入重复字段名称方法。在您的情况下,实现可能如下所示:

class CustomClass2Serializer extends StdSerializer<CustomClass2> {

    private final QName name = new QName("class2");

    public CustomClass2Serializer() {
        super(CustomClass2.class);
    }

    @Override
    public void serialize(CustomClass2 customClass2, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        final ToXmlGenerator xmlGenerator = (ToXmlGenerator) jsonGenerator;
        xmlGenerator.setNextName(name);
        xmlGenerator.writeStartObject();
        xmlGenerator.writeRaw(String.valueOf(customClass2.prop2));
        xmlGenerator.writeRepeatedFieldName();
        xmlGenerator.writeEndObject();
    }
}

and:

class CustomClass1Serializer extends StdSerializer<CustomClass1> {

    private final QName name = new QName("class1");

    public CustomClass1Serializer() {
        super(CustomClass1.class);
    }

    @Override
    public void serialize(CustomClass1 customClass1, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        final ToXmlGenerator xmlGenerator = (ToXmlGenerator) jsonGenerator;
        xmlGenerator.setNextName(name);
        xmlGenerator.writeStartObject();
        xmlGenerator.writeRaw(String.valueOf(customClass1.prop1));
        xmlGenerator.writeRepeatedFieldName();
        xmlGenerator.writeEndObject();
    }
}

生成XML应该如下所示:

<TestJacksonXml1>
  <class1>10</class1>
  <class2>20</class2>
</TestJacksonXml1>

您的情况的主要问题是您想跳过object节点为CustomClass1 and CustomClass1类。实现序列化器会更简单TestJacksonXml1 class:

class TestJacksonXml1JsonSerializer extends JsonSerializer<TestJacksonXml1> {
    @Override
    public void serialize(TestJacksonXml1 value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("class1", String.valueOf(value.obj1.prop1));
        gen.writeStringField("class2", String.valueOf(value.obj2.prop2));
        gen.writeEndObject();
    }
}

现在,TestJacksonXml1 类应如下所示:

@JsonSerialize(using = TestJacksonXml1JsonSerializer.class)
class TestJacksonXml1 {

    CustomClass1 obj1;
    CustomClass2 obj2;
    // getters, setters, etc
}

它应该生成相同的输出,但更容易实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个 Jackson XML 自定义 (XMLStreamWriter) 序列化程序抛出异常 的相关文章

随机推荐

  • 当html没有空格时如何平均分配li元素?

    我读了这篇文章几乎完整的 Flexbox 指南 没有 Flexbox 并且我尝试使用 空格之间 我有这样的代码 ul margin 0 padding 0 text align justify ul after content displa
  • 我的 xib 中的 UIButtons 发生了什么?

    我有一组 UIButton 在 xib 中定义 其标签需要定期更新 在这些按钮的超级视图的视图控制器的 ViewDidLoad 方法中 我有一个针对每个按钮的更新方法 button titleLabel text Relevant Text
  • 如何使用Java从目录中删除文件?

    谁能告诉我如何在打开并加载到数据库后删除目录中的文件 这是我的代码 public static void main String args throws SQLException int Count 0 File directory new
  • Objective C 如何为整个应用程序上的所有 UI 按钮设置独占触摸

    我的应用程序在整个应用程序中有很多按钮 我想一次性将它们全部设置在一起 或应用程序中的所有视图 我们可以单独设置 button setExclusiveTouch YES 但我想一次设置应用程序中的所有按钮 我们可以设置所有视图独占触摸吗
  • OData路由异常

    我对此很陌生 所以我将从代码开始 然后我将进行解释 问题是这样的 HttpGet ODataRoute key public SingleResult
  • 当类实例的属性之一失效时自动删除类实例

    Set Up 说我有一个Snit class Snit pass And a Snot 其中包含最多四个的弱引用Snits import weakref class Snot def init self s1 None s2 None s3
  • 列出 git 中提交所触及的所有文件

    如何列出两次提交之间 触及 的所有文件 我正在寻找类似的命令git diff COMMIT1 COMMIT2 name only但包括后来修改和恢复的文件 例如 假设我有一个包含一系列提交 线性历史记录 的存储库 C0git diff根本不
  • 关于如何在 Scala 中使用随机值向现有 DataFrame 添加新列

    我有一个带有镶木地板文件的数据框 我必须添加一个包含一些随机数据的新列 但我需要彼此不同的随机数据 这是我的实际代码 spark的当前版本是1 5 1 cdh 5 5 2 val mydf sqlContext read parquet s
  • 如何将 2D Excel 表格“展平”或“折叠”为 1D?

    我有一个 Excel 中包含国家和年份的二维表 例如 1961 1962 1963 1964 USA a x g y France u e h a Germany o x n p 我想 展平 它 这样我在第一列中包含国家 地区 在第二列中包
  • Java中如何进行多行输入

    我正在尝试在 Java 中获取多行用户输入并将这些行分成一个array 我需要这个来解决在线法官的问题 我正在使用一个Scanner接受输入 我无法确定输入的结尾 我总是遇到无限循环 因为我不知道输入的大小 即行数 用空字符串终止输入 单击
  • 发送内容类型 application/x-www-form-urlencoded WSO2 ESB

    我一直在一个服务链中工作 该服务链通过 WSO2 EMM 中使用的不记名令牌来回答我 我在 ESB 中创建了一个代理 然后传递给一个新的序列来进行下一次调用 但是这个序列接收到一个 Content Type application x ww
  • 当系统时间错误时,如何在javascript中获得正确的时间?

    let currentDate new Date CurrentDate与系统时间有关 所以如果系统时间错误 currentDate也会错误 您可以使用原子钟 API 例如世界时钟 http worldclockapi com api js
  • 有哪些学习泛型的好资源? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 谁能帮助我从哪里开始以及了
  • 从 mongo 结果中删除 _id

    我对 mongo 和 nodejs 还很陌生 我的查询结果是 json 我只想将结果作为 http 请求返回 如下所示 app get itesms function req res items find toArray function
  • 在Scala中动态生成案例类

    我想读取一个相当大的 csv 文件并对其进行处理 切片 切块 总结等 interactively 数据探索 我的想法是将文件读入数据库 H2 并使用SQL来处理它 阅读文件 我使用Ostermiller csv 解析器 确定每列的类型 我随
  • RabbitMQ 接受连接但在接受任何输入之前关闭它们

    所以我刚刚安装了最新版本的rabbitmq并且我一直在努力让它工作 服务器正在运行 我重新启动了一次 以确保这是一个一致的问题 If I telnet localhost 5672 I get Trying 127 0 0 1 Connec
  • 使用 PHP 按姓氏对 CSV 文件进行排序

    如何使用 PHP 对以下 CSV 文件进行排序 我想按姓氏排序 我是否使用正则表达式以某种方式获取姓氏中的第一个字母 任何帮助表示赞赏 这是我的 CSV 文件的摘录 带有 名称和地址之间的分隔符 John C Buckley M D 123
  • 将 ISO-8859-2 转换为 UTF-8(波兰语字符)

    我正在尝试解析 XML 文件 http jstryczek blox pl rss2 表示其字符集是 ISO 8859 2 我的数据库是UTF 8的 所以我想将其转换为UTF 8 为此 我在字符串上运行以下命令 content iconv
  • Bootstrap 4 响应式实用程序可见/隐藏 xs sm lg 不工作

    使用新的响应式实用程序时遇到问题隐藏 可见类 当迁移到引导程序4 我知道 hidden 类已经从 v3 中删除并替换 with hidden up hidden down 使用新的 hidden up hidden down类 但元素没有更
  • 多个 Jackson XML 自定义 (XMLStreamWriter) 序列化程序抛出异常

    如果有多个自定义 XML 序列化程序 XMLStreamWriter 在类中 序列化失败 我有两节课 CustomClass1 CustomClass2 有一个包装类TestJacksonXml1 当我尝试序列化时TestJacksonXm