为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用相同的元素和其他元素映射 XML Wrapper

如何使用相同的元素和其他元素映射 XML Wrapper

不负相思意 2021-11-11 17:41:26
我有一个 XML 模式,带有一个元素name:<xsd:element name="name">  <xsd:complexType>    <xsd:sequence>      <xsd:element name="given" maxOccurs="unbounded" type="xsd:string"/>      <xsd:element name="family" type="xsd:string"/>    </xsd:sequence>  </xsd:complexType></xsd:element>我需要将它映射到工作 java 类。我有一个带有 JAXB XML 控制器的 Spring Boot 应用程序,它需要:<name>  <given>First</given>  <given>Second</given>  <family>Lastname</family></name>如果我使用自动模式源生成(使用 jaxb2-maven-plugin),我会得到一个类:            @XmlAccessorType(XmlAccessType.FIELD)            @XmlType(name = "", propOrder = {                "given",                "family"            })            public static class Name {                @XmlElement(required = true)                protected List<String> given = new ArrayList<>();                @XmlElement(required = true)                protected String family;                public List<String> getGiven() {                    if (given == null) {                        given = new ArrayList<>();                    }                    return this.given;                }                public void setGiven(List<String> given) {                    this.given = given;                }                public String getFamily() {                    return family;                }                public void setFamily(String value) {                    this.family = value;                }            }但问题是,当我运行 spring boot 应用程序并使用上述 XML 调用它时,出现错误:*....Name["given"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token*我无法控制发送数据的格式,因此无法更改接收到的 XML。我尝试了许多不同的解决方案,但我完全坚持这一点。你能帮我吗?
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

试试 @JacksonXmlElementWrapper(useWrapping = false)


例子


@Test

public void test2() throws JsonParseException, JsonMappingException, IOException {

    ObjectMapper mapper = new XmlMapper();

    Name name = mapper.readValue("<name>\n" + "  <given>First</given>\n" + "  <given>Second</given>\n"

                    + "  <family>Lastname</family>\n" + "</name>", Name.class);

    System.out.println(toString(name));

}


public static class Name {

    @JacksonXmlElementWrapper(useWrapping = false)

    public List<String> given = new ArrayList<>();

    @XmlElement(required = true)

    public String family;

}


public String toString(Object obj) {

    try {

        StringWriter w = new StringWriter();

        new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writeValue(w, obj);

        return w.toString();

    } catch (Exception e) {

        throw new RuntimeException(e);

    }

}

印刷


{

  "given" : [ "First", "Second" ],

  "family" : "Lastname"

}


查看完整回答
反对 回复 2021-11-11
  • 1 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信