Сохранение многоуровневых данных XML / JSON в таблицу - PullRequest
0 голосов
/ 22 октября 2019

Извините, если это глупый вопрос, я изучаю JPA и REST.

Я пытаюсь настроить службу REST, которая получает запрос POST с XML и записывает в одну таблицу,но я застрял с "подуровнями" в XML.

Это "нормальный" XML, который получает мой сервис (это на самом деле работает):

<somexml>
   <xmlid>1</xmlid>
   <xmldesc>Test</xmltest>
   <xmlclassif>04<xmlclassif>
   <xmlbar>123456789</xmlbar>
   <xmlsize>003</xmlsize>
   <xmlres>1</xmlres>
</somexml>

Вот«Особый» случай, когда я застрял:

<somexml>
   <xmlid>01</xmlid>
   <xmldesc>Test</xmltest>
   <xmlclassif>04<xmlclassif>
   <xmlbars>
      <xmlbarid>01</xmlbarid>
      <xmlbar>00000000001</xmlbar>
   </xmlbar>
   <xmlbars>
      <xmlbarid>01</xmlbarid>
      <xmlbar>00000000002</xmlbar>
   </xmlbar>
   <xmlbars>
      <xmlbarid>01</xmlbarid>
      <xmlbar>00000000003</xmlbar>
   </xmlbar>
   <xmlbars>
      <xmlbarid>01</xmlbarid>
      <xmlbar>00000000004</xmlbar>
   </xmlbar>
   <xmlsize>003</xmlsize>
   <xmlres>1</xmlres>
</somexml>

Если я получу один «xmlbar», мой сервис будет работать, как и ожидалось, но я не знаю, как «прочитать» кратные «xmlbars» и написатьу них в примере есть 4 "xmlbars", но может быть гораздо больше.

Мне нужны следующие данные в таблице из приведенного выше примера: https://i.imgur.com/kX1RJdI.png

Вот моя сущность:

@Entity
@Table(name = "somexml")
@XmlRootElement
public class Somexml{
    private Long xmlid;
    private Long xmldesc;
    private Long xmlclassif;
    private Long xmlbar;
    private Long xmlsize;
    private Long xmlres;


    public Somexml(Long xmlid, Long xmldesc, Long xmlclassif, Long xmlbar, Long xmlsize, Long xmlres) {
        super();
    }

    public Somexml() {
        super();
        this.xmlid = xmlid;
        this.xmldesc = xmldesc;
        this.xmlclassif = xmlclassif;
        this.xmlbar = xmlbar;
        this.xmlsize = xmlsize;
        this.xmlres= xmlres;

    }

... getters and setters

Репозиторий

@Repository
public interface XmlRepository extends JpaRepository<Xml, Long>{

}

... и вот звонок от контроллера

@PostMapping(path = "/xml")
    public Xml createXml(@RequestBody Xml xml) {
        Xml savedXml = xmlRepository.save(xml);

        return xml;
    }

Я не знаю, является ли лучший способ сделать это,но это способ, который я узнал / знаю, если у вас есть лучший способ, используя Spring boot, я ценю.

1 Ответ

0 голосов
/ 24 октября 2019

Допустимая альтернатива - создать собственный тип, а затем преобразователь для него. Например, допустим, вы хотите сохранить JSON. Сначала вы определяете свой собственный тип для него:

public class Json extends HashMap<String, String> {}

Затем вы создаете свой собственный конвертер для нового типа, реализуя AttributeConverter. Или вы можете даже определить абстрактный класс, который реализует интерфейс и действует как базовый преобразователь, а затем расширять его всякий раз, когда вам нужен новый преобразователь для другого типа. В любом случае, основная идея будет выглядеть так:

@Converter (autoApply = true)
public class JsonConverter implements AttributeConverter<Json, String> { 
   @Override
   public String convertToDatabaseColumn(Json json) {
       // ...
   }

   @Override
   public Color convertToEntityAttribute(String colorString) {
       // ...
   }
}

Теперь вы можете использовать его в своих сущностях следующим образом:

@Entity
public class MyEntity {
    @Convert(converter = JsonConverter.class)
    private Json myJsonInformation;
}

Здесь вы можете прочитать больше об AttributeConverter.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...