【问题标题】:SpringBoot ArrayList/JSON: add all Elements of a certain type to a list of this typeSpring Boot ArrayList/JSON:将某种类型的所有元素添加到该类型的列表中
【发布时间】:2020-06-17 23:29:29
【问题描述】:

我正在尝试编写一个 REST API 来管理发票。作为这个项目的一部分,我遇到了一个问题。 如果在 Json 发布请求中指定了对象,我无法弄清楚如何将某种类型的对象添加到该类型的列表中。 Jason 包含 3 个主要元素:

发票编号 - 收件人(包含该收件人所需的所有数据) - 文章数量未知

虽然控制器很好地保存了发票编号和收件人,但它不会保存文章,也不会将它们添加到发票列表中。

我确实在 Stackoverflow 上搜索过此类问题,但是直到现在我还没有找到解决方案。

我还尝试使用 ObjectMapper 将整个 Jason Post 映射到地图,但如果我必须将每个输入映射到地图,然后搜索地图以重建对象,那么这既不方便,也不高效我可以将它们保存到数据库中。

在我开始从事这个项目之前,我对 Spring boot 完全不了解,只有非常基本的 Java 知识,现在我发现自己陷入了困境。

为了给你一个想法,这里是我的控制器:

@RestController
public class RechnungController {

@Autowired
private RechnungRepository rechnung_repo;

@Autowired
private EmpfaengerRepository empf_repo;



//Get Mappings


@PostMapping ("/rechnungen")
@ResponseBody
public Rechnung rechnungSave (@RequestBody Rechnung r) {

     Rechnung r_save = rechnung_repo.save(r);
     return r_save;
}



//More get Mapping


}

这是我的发票定义:

@Entity
public class Rechnung  {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long Id;

    private int rechnungsnummer;

    @OneToMany (
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    @JoinColumn (name ="rechnungID")
    private List <Artikel> artikelliste = new ArrayList <Artikel>();//erstellt eine Liste von Artikeln vom Typ ArrayList


    @OneToOne (cascade = CascadeType.ALL)
    @JoinColumn(name= "empf", referencedColumnName = "Id")
    @RestResource
    private Empfaenger empfaenger;

//Getters Setters and Constructor

这是我要发布的 Json

{
"rechnungsnummer":"02552425",
"empfaenger": {
    "name" : "nnnnnn",
    "vorname" : "vvvvv"
    },

"artikels":{
    "artikel":{

        "preis":"12.33"
    }
"artikel":{

        "preis":"12.33"
    }
}
}

任何指针都会有所帮助。 谢谢。

【问题讨论】:

  • 所以你的问题是什么类型的 JAVA 对象可以处理你的 JSON ?您应该使用哈希图。
  • Json好像无效,artikels好像是一个列表,所以应该有方括号"artikels":["artikel":{}]
  • 通常,返回一个实体不是一个好主意。您应该将您的实体映射到 DTO。当 DTO 用于在进程之间传输数据时,实体会链接到您的数据库。

标签: java json spring-boot jpa


【解决方案1】:

JSON 属性名称默认为 Java 属性名称,因此在 JSON 中为 artikelliste

您可以(并且应该)使用以下注释指定 JSON 属性名称:

 @JsonProperty("artikels")
 private List <Artikel> artikelliste ...

@JsonIgnoreProperties 可以帮助您发现此类错误 - 在严格模式 (ignoreUnknown = false) 下,使用未知属性会导致错误。通常使用ignoreUnknown = true,但随后您应该添加测试以检查数据是否真的正确编组为 JSON 并返回。

旁注:

  • 将实体用作 Web 服务的参数或结果类型是不好的做法。
  • 您应该改用 DTO(数据传输对象),您可以在其中控制您公开或接受的内容,并在 DTO 和实体之间进行映射。

【讨论】:

  • 谢谢,我正在研究 DTO。添加一个 @JsonProperty("artikelliste") 并调整 json 以反映该更改以及 Smile 之前建议的更改确实会改变一些事情,我现在得到一个需要调查的错误。
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2013-06-20
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多