【问题标题】:Persisting a multiple level XML/JSON Data into a Table将多级 XML/JSON 数据保存到表中
【发布时间】:2019-10-22 19:42:55
【问题描述】:

对不起,如果这是一个愚蠢的问题,我正在学习 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,我很感激。

【问题讨论】:

    标签: xml rest spring-boot jpa


    【解决方案1】:

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

    Here 你可以阅读更多关于 AttributeConverter 的内容。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多