我想知道是否可以将2个实体解析为我的控制器的一个JSON,它有2x @ RequestBody(对于每个实体),首先我想检查是否可行,因为我希望有一个3x的控制器@ RequestBody(3个实体)。
控制器看起来像这样:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<KoordynatorzyPraktykEntity> addCoordinator(@RequestBody KoordynatorzyPraktykEntity koordynatorzyPraktykEntity, @RequestBody OsobyEntity osobyEntity) {
KoordynatorzyPraktykEntity addCoordinator = ikoordynatorzyPraktykService.addCoordinator(koordynatorzyPraktykEntity);
OsobyEntity addPerson = ikoordynatorzyPraktykService.addPerson(osobyEntity, koordynatorzyPraktykEntity);
if (addCoordinator !=null && addPerson !=null) {
return new ResponseEntity<KoordynatorzyPraktykEntity>(addCoordinator, HttpStatus.OK);
}
else {
return new ResponseEntity<KoordynatorzyPraktykEntity>(HttpStatus.NOT_FOUND);
}
}
服务:
@Override
public OsobyEntity addPerson(OsobyEntity osobyEntity, KoordynatorzyPraktykEntity koordynatorzyPraktykEntity) {
OsobyEntity newPerson = iosobyDAO.addPerson(osobyEntity);
newPerson.setKoordynator(koordynatorzyPraktykEntity);
int idOsoby = newPerson.getIdOsoby();
koordynatorzyPraktykEntity.setIdOsoby(idOsoby);
koordynatorzyPraktykEntity.setKoordynatorByIdOsoby(newPerson);
return newPerson;
}
Osoby(人)的实体
@Entity
@Table(name = "osoby", schema = "public", catalog = "praktykidb")
public class OsobyEntity {
private int idOsoby;
/*
some stuff
*/
private KoordynatorzyPraktykEntity koordynator;
@Id
@GeneratedValue
@Column(name = "id_osoby")
public int getIdOsoby() {
return idOsoby;
}
public void setIdOsoby(int idOsoby) {
this.idOsoby = idOsoby;
}
/*
some stuff
*/
@OneToOne(mappedBy = "koordynatorByIdOsoby", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public KoordynatorzyPraktykEntity getKoordynator() {
return koordynator;
}
public void setKoordynator(KoordynatorzyPraktykEntity koordynator) {
this.koordynator = koordynator;
}
和Koordynatorzy(协调员)实体:
@Entity
@Table(name = "koordynatorzy_praktyk", schema = "public", catalog = "praktykidb")
public class KoordynatorzyPraktykEntity {
private int idKoordynatoraPraktyk;
private int idOsoby;
private String doTestow;
private OsobyEntity koordynatorByIdOsoby;
private Collection<KoordynatorzyKierunkowiEntity> koordynatorzyByIdKierunku;
@Id
@GeneratedValue
@Column(name = "id_koordynatora_praktyk")
public int getIdKoordynatoraPraktyk() {
return idKoordynatoraPraktyk;
}
public void setIdKoordynatoraPraktyk(int idKoordynatoraPraktyk) {
this.idKoordynatoraPraktyk = idKoordynatoraPraktyk;
}
@Basic
@Column(name = "id_osoby")
public int getIdOsoby() {
return idOsoby;
}
public void setIdOsoby(int idOsoby) {
this.idOsoby = idOsoby;
/*
some stuff
*/
@JsonIgnore
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id_osoby", referencedColumnName = "id_osoby", insertable = false , updatable = false)
public OsobyEntity getKoordynatorByIdOsoby() {
return koordynatorByIdOsoby;
}
public void setKoordynatorByIdOsoby(OsobyEntity koordynatorByIdOsoby) {
this.koordynatorByIdOsoby = koordynatorByIdOsoby;
}
@JsonIgnore
@OneToMany(mappedBy = "koordynatorzyByIdKierunku", cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
public Collection<KoordynatorzyKierunkowiEntity> getKoordynatorzyByIdKierunku() {
return koordynatorzyByIdKierunku;
}
public void setKoordynatorzyByIdKierunku(Collection<KoordynatorzyKierunkowiEntity> koordynatorzyByIdKierunku) {
this.koordynatorzyByIdKierunku = koordynatorzyByIdKierunku;
}
我知道我可以轻松地在PersonEntity中创建Person并使用@RequestMapping(value =“/ {PersonID} / coordinator,method = POST(将CoordinatorEntity解析为JSON并为每个实体设置关系)将协调者附加到此{PersonID},但我想测试一下simillar(使用2xrequestBody)是否可以工作,因为在不久的将来(明天可能......)我将为现有关系创建新的东西,现在看起来像这样。
[StudentEntity] [AddressEntity]
idOfStudent (PK) /--------idOfAddress (PK)
idOfAddress (FK)<-----/
idOfPerson (FK)<-----\ [PersonEntity]
\--------idOfPerson (PK)
使用2实体它不是问题,但是3我不知道该怎么办,因为当我创建学生时它将地址和人的ID分配为0,然后当我想添加例如地址我想搜索(em.find)学生有他的id,但他也在寻找地址和人物实体中的行,idOfAddress = 0和idOfPerson = 0.当我将Student持久化为实体时,有可能使这些ID为null吗?其他一些想法可能吗?
答案 0 :(得分:0)
这是一种错误的方法,因为请求体只能被消耗一次,所有后续再次处理体的尝试都会导致IOException说流关闭。
对于您的类型 OsobyEntity 和 KoordynatorzyPraktykEntity ,您应该做的是build and register a custom argument resolver并获得相同的效果。