Как отобразить XML Wrapper с теми же элементами и другими элементами - PullRequest
0 голосов
/ 11 октября 2018

У меня есть 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контроллер, который принимает:

<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;
                }

            }

Но проблема в том,когда я запускаю приложение весенней загрузки и вызываю его с помощью вышеуказанного 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 Ответ

0 голосов
/ 11 октября 2018

Попробуйте с @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"
}
...