Как десериализовать XML с одинаковыми именами в атрибуте и свойстве? - PullRequest
0 голосов
/ 07 июня 2019

Джексон выбрасывает jackson.databind.JsonMappingException: конфликт конфликтующих определений для свойства "NewStatus" из-за одинаковых имен в атрибуте и свойстве.

Я пытался изменить имя свойства во время синтаксического анализа, используя «костыль», который заменяет «NewStatus» на «New_Status», но это вызывает много разных проблем.

<Test NewStatus="1111111">
    <NewStatus Description="TestDesc"/>
</Test>

@Data
public static class Test {

@JacksonXmlProperty(isAttribute = true, localName = "NewStatus")
private String newStatusAttribute;

@JacksonXmlProperty(localName = "NewStatus")
private NewStatus newStatusTag;

@Data
public static class NewStatus {

@JacksonXmlProperty(localName = "Description")
private String description;
}
}

Я хочу, чтобы Джексон анализировал значения из атрибута и свойства.

1 Ответ

0 голосов
/ 07 июня 2019

Похоже, что есть известная проблема. Однако я попытался сгенерировать в соответствии с вашей XML-структурой. Найдите ниже код. Существует небольшая проблема, вы можете узнать больше об этом.

import com.fasterxml.jackson.xml.annotate.JacksonXmlProperty;
import com.fasterxml.jackson.xml.annotate.JacksonXmlRootElement;

@JacksonXmlRootElement(localName = "NewStatus")
public class NewStatus {
  @JacksonXmlProperty(isAttribute = true)
  private String description;

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}


import com.fasterxml.jackson.xml.annotate.JacksonXmlProperty;
import org.codehaus.jackson.annotate.JsonIgnore;

public class Test {
  @JacksonXmlProperty(isAttribute = true, localName = "NewStatus")
  private String statusAttribute;

  @JacksonXmlProperty(localName = "NewStatus")
  @JsonIgnore
  private NewStatus newStatus;

  public String getStatusAttribute() {
    return statusAttribute;
  }

  public void setStatusAttribute(String statusAttribute) {
    this.statusAttribute = statusAttribute;
  }

  public NewStatus getNewStatus() {
    return newStatus;
  }

  public void setNewStatus(NewStatus newStatus) {
    this.newStatus = newStatus;
  }
}

Тестовый код для проверки.

import com.fasterxml.jackson.xml.XmlMapper;

import java.io.IOException;

public class Test1 {

  public static void main(String[] args) throws IOException {
    final XmlMapper xmlMapper = new XmlMapper();

    NewStatus newStatus = new NewStatus();
    newStatus.setDescription("TestDesc");

    Test test = new Test();
    test.setNewStatus(newStatus);
    test.setStatusAttribute("1111111");

    String xmlStr = xmlMapper.writeValueAsString(test);

    System.out.println(xmlStr);
  }
}

Сгенерированный xml выглядит следующим образом.

<Test NewStatus="1111111"><newStatus description="TestDesc"/></Test>

Если вы посмотрите внимательно, <newStatus ...> идет по-другому, несмотря на некоторые усилия. Это небольшая проблема. Либо вы можете изменить имя тега и имя переменной соответственно.

Кроме того, я добавил следующие зависимости в мой файл maven pom.xml.

<dependency>
            <groupId>com.fasterxml</groupId>
            <artifactId>jackson-xml-databind</artifactId>
            <version>0.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.woodstox</groupId>
            <artifactId>woodstox-core-asl</artifactId>
            <version>4.1.4</version>
        </dependency>

Надеюсь, этот пост будет вам полезен.

...