首页 > 解决方案 > 将多级 XML/JSON 数据保存到表中

问题描述

抱歉,如果这是一个愚蠢的问题,我正在学习 JPA 和 REST。

我正在尝试设置一个 REST 服务,该服务接收带有 XML 的 POST 请求并写入单个表,但我被困在 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,我很感激。

标签: xmlrestspring-bootjpa

解决方案


一个有效的替代方法是创建自己的类型,然后为它创建一个转换器。例如,假设您想要持久化 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 的信息。

希望这可以帮助!


推荐阅读