У меня есть список объектов «Персонал», который я возвращаю из моего контроллера Spring Boot ReST.Вывод в порядке, за исключением одного вопроса.
Этот объект Personnel имеет объект PersonnelType в качестве одного из вложенных объектов.При сериализации первого объекта Personnel в списке сериализуется весь подобъект PersonnelType, чего я и хочу.
Однако, если второй или последующие объекты Personnel в Списке имеют тот же PersonnelType (тот же идентификатор), что и PersonnelType, уже сериализованный в первом объекте Personnel, эти последующие объекты PersonnelType сериализуются только с «id»а не весь объект.
Например, вот сериализованный вывод:
[
{
"id": 2,
"creatorUserId": null,
"creationTime": null,
"lastModifierUserId": null,
"lastModificationTime": null,
"workforceId": 9994323221,
"workPhoneNumber": "7034563452",
"workEmailAddress": "xxx@epa.gov",
"currentPosition": "Developer",
"isSponsored": false,
"dateOfSponsorship": null,
"sponsorPersonnelId": null,
"isLEO": true,
"isFERO": false,
"requireComputerAndEmailAccess": true,
"isPriorityCase": false,
"building": {
"id": 1,
"creatorUserId": null,
"creationTime": null,
"lastModifierUserId": null,
"lastModificationTime": null,
"isActive": true,
"buildingName": "Robert C Byrd Courthouse and FOB",
"buildingNumber": "406",
"displayGlobal": false,
"facilityName": "Robert C Byrd Courthouse",
"facilityNumber": "107",
"handler": {},
"hibernateLazyInitializer": {}
},
"personnelType": {
"id": 1,
"creatorUserId": null,
"creationTime": null,
"lastModifierUserId": null,
"lastModificationTime": null,
"description": "Federal Employee",
"isActive": true,
"handler": {},
"hibernateLazyInitializer": {}
}
},
{
"id": 2,
"creatorUserId": null,
"creationTime": null,
"lastModifierUserId": null,
"lastModificationTime": null,
"workforceId": 9994323221,
"workPhoneNumber": "7034563452",
"workEmailAddress": "xxx@epa.gov",
"currentPosition": "Developer",
"isSponsored": false,
"dateOfSponsorship": null,
"sponsorPersonnelId": null,
"isLEO": true,
"isFERO": false,
"requireComputerAndEmailAccess": true,
"isPriorityCase": false,
"building": {
"id": 1,
"creatorUserId": null,
"creationTime": null,
"lastModifierUserId": null,
"lastModificationTime": null,
"isActive": true,
"buildingName": "Robert C Byrd Courthouse and FOB",
"buildingNumber": "406",
"displayGlobal": false,
"facilityName": "Robert C Byrd Courthouse",
"facilityNumber": "107",
"handler": {},
"hibernateLazyInitializer": {}
},
"personnelType": 1
}
]
Выше, первый объект Personnel в сериализованном списке имеет полный объект для сериализации PersonnelType, тогда как второй объект Personnel в сериализованномВ списке PersonnelType сериализовано ТОЛЬКО в качестве идентификатора, поскольку идентификатор для PersonnelType (id = 1) такой же, как и для PersonnelType в первом объекте Personnel в списке.
Это поведение по умолчанию для сериализатора Джексона?Я не использую @JsonIdentityReference и, следовательно, по умолчанию это false.
@ JsonIdentityReference Marker, чтобы указать, должны ли все ссылочные значения быть сериализованы как идентификаторы (true);или путем сериализации первой встреченной ссылки как POJO и только затем как id (false).
Как я могу изменить сериализацию так, чтобы я возвращал полный подобъект PersonnelType в каждом объекте персонала в списке(даже если он уже был сериализован один раз в предыдущем объекте Personnel в Списке)?
Вот моя сущность Personnel с аннотациями:
@Entity
@Table(name = "Personnel", schema = "dbo", catalog = "PSSV2Db")
@EntityListeners(AuditingEntityListener.class)
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id",resolver = EntityIdResolver.class, scope = PersonnelEntity.class)
public class PersonnelEntity extends AuditedEntity<String> {
private Long id;
private Long workforceId;
private String workPhoneNumber;
private String workEmailAddress;
private String UPN;
private String currentPosition;
private Boolean isSponsored;
private LocalDate dateOfSponsorship;
private String sponsorPersonnelId;
private Boolean isLEO;
private Boolean isFERO;
private Boolean requireComputerAndEmailAccess;
private Boolean isPriorityCase;
@Id
@Column(name = "PersonnelId", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Basic
@Column(name = "WorkforceId", nullable = false)
public Long getWorkforceId() {
return workforceId;
}
public void setWorkforceId(Long workforceId) {
this.workforceId = workforceId;
}
@Basic
@Column(name = "WorkPhoneNumber", nullable = true)
public String getWorkPhoneNumber() {
return workPhoneNumber;
}
public void setWorkPhoneNumber(String workPhoneNumber) {
this.workPhoneNumber = workPhoneNumber;
}
@Basic
@Column(name = "WorkEmailAddress", nullable = true)
public String getWorkEmailAddress() {
return workEmailAddress;
}
public void setWorkEmailAddress(String workEmailAddress) {
this.workEmailAddress = workEmailAddress;
}
@Basic
@Column(name = "UPN", nullable = true)
public String getUPN() {
return UPN;
}
public void setUPN(String UPN) {
this.UPN = UPN;
}
@Basic
@Column(name = "CurrentPosition", nullable = true)
public String getCurrentPosition() {
return currentPosition;
}
public void setCurrentPosition(String currentPosition) {
this.currentPosition = currentPosition;
}
@Basic
@Column(name = "IsSponsored", nullable = true)
public Boolean getIsSponsored() {
return isSponsored;
}
public void setIsSponsored(Boolean sponsored) {
this.isSponsored = sponsored;
}
@Basic
@Column(name = "DateOfSponsorship", nullable = true)
public LocalDate getDateOfSponsorship() {
return dateOfSponsorship;
}
public void setDateOfSponsorship(LocalDate dateOfSponsorship) {
this.dateOfSponsorship = dateOfSponsorship;
}
@Basic
@Column(name = "SponsorPersonnelId", nullable = true)
public String getSponsorPersonnelId() {
return sponsorPersonnelId;
}
public void setSponsorPersonnelId(String sponsorPersonnelId) {
this.sponsorPersonnelId = sponsorPersonnelId;
}
@Basic
@Column(name = "IsLEO", nullable = false)
public Boolean getIsLEO() {
return isLEO;
}
public void setIsLEO(Boolean LEO) {
this.isLEO = LEO;
}
@Basic
@Column(name = "IsFERO", nullable = false)
public Boolean getIsFERO() {
return isFERO;
}
public void setIsFERO(Boolean FERO) {
this.isFERO = FERO;
}
@Basic
@Column(name = "RequireComputerAndEmailAddress", nullable = false)
public Boolean getRequireComputerAndEmailAccess() {
return requireComputerAndEmailAccess;
}
public void setRequireComputerAndEmailAccess(Boolean requireComputerAndEmailAccess) {
this.requireComputerAndEmailAccess = requireComputerAndEmailAccess;
}
@Basic
@Column(name = "IsPriorityCase", nullable = false)
public Boolean getIsPriorityCase() {
return isPriorityCase;
}
public void setIsPriorityCase(Boolean isPriorityCase) {
this.isPriorityCase = isPriorityCase;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PersonnelEntity)) return false;
PersonnelEntity that = (PersonnelEntity) o;
return Objects.equals(getId(), that.getId()) &&
Objects.equals(getWorkforceId(), that.getWorkforceId()) &&
Objects.equals(getWorkPhoneNumber(), that.getWorkPhoneNumber()) &&
Objects.equals(getWorkEmailAddress(), that.getWorkEmailAddress()) &&
Objects.equals(getUPN(), that.getUPN()) &&
Objects.equals(getCurrentPosition(), that.getCurrentPosition()) &&
Objects.equals(getIsSponsored(), that.getIsSponsored()) &&
Objects.equals(getDateOfSponsorship(), that.getDateOfSponsorship()) &&
Objects.equals(getSponsorPersonnelId(), that.getSponsorPersonnelId()) &&
Objects.equals(getIsLEO(), that.getIsLEO()) &&
Objects.equals(getIsFERO(), that.getIsFERO()) &&
Objects.equals(getRequireComputerAndEmailAccess(), that.getRequireComputerAndEmailAccess()) &&
Objects.equals(getIsPriorityCase(), that.getIsPriorityCase());
}
@Override
public int hashCode() {
return Objects.hash(getId(), getWorkforceId(), getWorkPhoneNumber(), getWorkEmailAddress(), getUPN(), getCurrentPosition(), getIsSponsored(), getDateOfSponsorship(), getSponsorPersonnelId(), getIsLEO(), getIsFERO(), getRequireComputerAndEmailAccess(), getIsPriorityCase());
}
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "BuildingId")
public BuildingsEntity getBuilding() {
return building;
}
public void setBuilding(BuildingsEntity building) {
this.building = building;
}
private BuildingsEntity building;
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "PersonnelTypeId")
public PersonnelTypesEntity getPersonnelType() {
return personnelType;
}
public void setPersonnelType(PersonnelTypesEntity personnelType) {
this.personnelType = personnelType;
}
private PersonnelTypesEntity personnelType;
}
Вот сущность PersonnelType с аннотациями:
@Entity
@Table(name = "PersonnelTypes", schema = "dbo", catalog = "PSSV2Db")
@EntityListeners(AuditingEntityListener.class)
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", resolver = EntityIdResolver.class, scope = PersonnelTypesEntity.class)
public class PersonnelTypesEntity extends AuditedEntity<String> {
private long id;
private String description;
private Boolean isActive;
@Id
@Column(name = "PersonnelTypeId", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Basic
@Column(name = "Description", nullable = true, length = 8000)
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Basic
@Column(name = "IsActive", nullable = false)
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PersonnelTypesEntity)) return false;
PersonnelTypesEntity that = (PersonnelTypesEntity) o;
return getId() == that.getId() &&
Objects.equals(getDescription(), that.getDescription()) &&
Objects.equals(getIsActive(), that.getIsActive());
}
@Override
public int hashCode() {
return Objects.hash(getId(), getDescription(), getIsActive());
}
}