如何将2个实体解析为Controller的JSON(具有2x @RequestBody参数)

时间:2015-01-21 18:47:28

标签: json spring hibernate spring-mvc

我想知道是否可以将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吗?其他一些想法可能吗?

1 个答案:

答案 0 :(得分:0)

这是一种错误的方法,因为请求体只能被消耗一次,所有后续再次处理体的尝试都会导致IOException说流关闭。

对于您的类型 OsobyEntity KoordynatorzyPraktykEntity ,您应该做的是build and register a custom argument resolver并获得相同的效果。