xml - 将多级 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,我很感激。
解决方案
一个有效的替代方法是创建自己的类型,然后为它创建一个转换器。例如,假设您想要持久化 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 的信息。
希望这可以帮助!
推荐阅读
- docker - 相当于带有 docker-for-desktop Kubernetes 节点的“minikube ssh”
- deep-learning - 从 github 导入 Matterport 的 Mask-RCNN 模型 - 错误:ZipImportError: bad local file header
- java - 在表格中应用分页后如何使用 Selenium 验证行数?
- java - 如何在构建谷歌操作时访问已登录谷歌用户帐户的联系人
- linux - Linux PhpStorm 无法连接到远程服务器 只有 OpenSSH 格式的 SSH2 密钥
- vaadin - Vaadin-flow 组合框如何与值更改侦听器一起使用?
- c - 在树中插入(键,值)时,节点不形成树结构
- ruby-on-rails - 在另一个表中创建一个新行,并在另一个表中更改状态
- python - 加载 keras 模型并将其缓存在变量中,而无需重新加载
- php - 如何将php数组读入变量