XML-сопоставление с Джексоном без конструктора аргумента строки / метода фабрики для десериализации из значения строки («бельгийские вафли») - PullRequest
0 голосов
/ 12 июня 2019

в учебных целях я пытаюсь сопоставить XML-файл с pojo.Мой XML выглядит следующим образом:

<breakfast_menu>
   <food>
     <name>Belgian Waffles</name>
     <price>$5.95</price>
     <description>
        Two of our famous Belgian Waffles with plenty of real maple syrup
     </description>
     <calories>650</calories>
   </food>
   <food>
     <name>Strawberry Belgian Waffles</name>
     <price>$7.95</price>
     <description>
        Light Belgian waffles covered with strawberries and whipped cream
     </description>
     <calories>900</calories>
   </food>
</breakfast_menu>

Класс сущности Breakfes

@JacksonXmlRootElement(localName = "breakfast_menu")
public class BreakfestFood {

    private List<Food> food;

    public BreakfestFood() {}

    public List<Food> getFood() {
        return food;
    }

    public void setFood(List<Food> food) {
        this.food = food;
    }

}

Класс сущности пищи

@JacksonXmlRootElement(localName = "food")
public class Food {

    @JacksonXmlProperty(localName = "name")
    private String name;
    @JacksonXmlProperty
    private double price;
    @JacksonXmlProperty
    private String description;
    @JacksonXmlProperty
    private int calories;

И основная функция:

public static void main(String[] args) {
    File file = new File("X:\\food.xml");
    XmlMapper xmlMapper = new XmlMapper();

    try {
        String xml = inputStreamToString(new FileInputStream(file));
        BreakfestFood value = xmlMapper.readValue(xml, BreakfestFood.class);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Когда я запускаю этот код, я получаю стек следующим образом: конструктор аргумента строки / метод фабрики для десериализации из значения строки («бельгийские вафли»).Таким образом, кажется, он не может отобразить название стоимости еды.Кто-нибудь имеет представление, что не так?

1 Ответ

1 голос
/ 13 июня 2019

Ваше отображение неверно. Чтобы проверить, что не так, я рекомендую вам сериализовать простой объект.

BreakfestFood bf = new BreakfestFood();
Food f1 = new Food();
f1.setName("f1Name");
f1.setCalories(20);
f1.setDescription("desc");
f1.setPrice(11.1);
bf.setFood(List.of(f1));

System.out.println(xmlMapper.writeValueAsString(bf));

Output: 
<breakfast_menu>
  <food>
    <food>
      <price>11.1</price>
      <description>desc</description>
      <calories>20</calories>
      <name>f1Name</name>
    </food>
  </food>
</breakfast_menu>

Как видите, вы получаете дополнительную обертку для списка. Чтобы избавиться от него, используйте:

@JacksonXmlRootElement(localName = "breakfast_menu")
public class BreakfestFood {

    // Use this to change element name:
    // @JacksonXmlProperty(localName = "food")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Food> food;

    // getters and setters
}

Кроме того:

  • аннотации в Food являются излишними, если у вас есть общественные получатели
  • значения в ценнике не являются двойными. Вам нужно будет настроить отображение, чтобы проанализировать значения валют. Пользовательские @JsonSerialize и @JsonDeserialize являются одной из идей для решения этой проблемы.
  • В общем, хранить цены как двойные числа - плохая идея.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...