代码之家  ›  专栏  ›  技术社区  ›  bharath

未能评估Jackson反序列化,无法处理托管/返回引用“DefaultReference”(JSON)

  •  0
  • bharath  · 技术社区  · 6 年前

    我有一个班 学生管理员助理 有其他类引用的

    如下所示

    学生管理员助理

    package com.rasvek.cg.entity;
    
    import java.util.List;
    
    import com.fasterxml.jackson.annotation.JsonBackReference;
    
    public class StudentAdmissinAssoDTO
    {
        private PrimaryStudentAdmission primaryAdmission;
        private StudentDetails studentDetailsDto;
        private StudentJoiningDetails studentJoiningDetails;
        private StudentPresentClassDetails studentPresentClassDetails;
        private StudentGeneralDetails studentGeneralDetails;
        private StudentPrevSchoolDetails studentPrevSchoolDetails;
        private StudentParentDetails studentParentDetails; 
        private MasterAddress masterAddress; 
        private List<AssocFeeStudent> assocFeeStudentId;
        public StudentDetails getStudentDetailsDto() {
            return studentDetailsDto; 
        } 
    
        public void ListStudentDetailsDto(StudentDetails studentDetailsDto) {
            this.studentDetailsDto = studentDetailsDto;
        }
    
        public PrimaryStudentAdmission getPrimaryAdmission() {
            return primaryAdmission;
        }
    
        public void ListPrimaryAdmission(PrimaryStudentAdmission primaryAdmission) {
            this.primaryAdmission = primaryAdmission;
        }  
    
        public StudentJoiningDetails getStudentJoiningDetails() {
            return studentJoiningDetails;
        }
    
        public void ListStudentJoiningDetails(StudentJoiningDetails studentJoiningDetails) {
            this.studentJoiningDetails = studentJoiningDetails;
        }
    
        public StudentPresentClassDetails getStudentPresentClassDetails() {
            return studentPresentClassDetails;
        }
    
        public void ListStudentPresentClassDetails(StudentPresentClassDetails studentPresentClassDetails) {
            this.studentPresentClassDetails = studentPresentClassDetails;
        }
    
        public StudentGeneralDetails getStudentGeneralDetails() {
            return studentGeneralDetails;
        }
    
        public void ListStudentGeneralDetails(StudentGeneralDetails studentGeneralDetails) {
            this.studentGeneralDetails = studentGeneralDetails;
        }
    
        public StudentPrevSchoolDetails getStudentPrevSchoolDetails() {
            return studentPrevSchoolDetails;
        }
    
        public void ListStudentPrevSchoolDetails(StudentPrevSchoolDetails studentPrevSchoolDetails) {
            this.studentPrevSchoolDetails = studentPrevSchoolDetails;
        }
    
        public StudentParentDetails getStudentParentDetails() {
            return studentParentDetails;
        }
    
        public void ListStudentParentDetails(StudentParentDetails studentParentDetails) {
            this.studentParentDetails = studentParentDetails;
        }
    
        public MasterAddress getMasterAddress() {
            return masterAddress;
        }
    
        public void ListMasterAddress(MasterAddress masterAddress) {
            this.masterAddress = masterAddress; 
        }
    
        public List<AssocFeeStudent> getAssocFeeStudentId() {
            return assocFeeStudentId;
        }
    
        public void ListAssocFeeStudentId(List<AssocFeeStudent> assocFeeStudentId) {
            this.assocFeeStudentId = assocFeeStudentId;
        }
    
    
    }
    

    我得到了这个例外

    [org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.logWarningIfNecessary(AbstractJackson2HttpMessageConverter.java:205)] 
      Failed to evaluate Jackson deserialization for type [[simple type, class com.rasvek.cg.entity.StudentAdmissinAssoDTO]]: java.lang.IllegalArgumentException: Can not handle managed/back reference 'defaultReference': no back reference property found from type [collection type; class java.util.Set, contains [simple type, class com.rasvek.cg.entity.MasterAddress]]
    

    请看一下 主地址

    package com.rasvek.cg.entity;
     //Generated May 14, 2018 11:39:07 PM by Hibernate Tools 5.1.7.Final
    
    import java.util.HashSet;
    import java.util.Set;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import static javax.persistence.GenerationType.IDENTITY;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
    import javax.persistence.Transient;
    
    import com.fasterxml.jackson.annotation.JsonBackReference;
    import com.fasterxml.jackson.annotation.JsonIdentityInfo;
    import com.fasterxml.jackson.annotation.JsonManagedReference;
    import com.fasterxml.jackson.annotation.ObjectIdGenerators;
    
    /**
     * MasterAddress generated by hbm2java
     */
    @Entity
    @Table(name = "master_address", catalog = "campus_guru_01")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "addressId")
    public class MasterAddress implements java.io.Serializable {
    
        private Integer addressId;
        private Integer studentAdmissionId;
        private String isSame;  
    
        private MasterAddressCountry masterAddressCountry;
        private MasterAddressDistrict masterAddressDistrict;
        private MasterAddressState masterAddressState;
        private String houseNum;
        private String streetAddress;
        private String citymandal;
        private String pincode;
        private String addressType;
        private Set<AssocStaffAddress> assocStaffAddresses = new HashSet<AssocStaffAddress>(0);
        private Set<AssocStudentAddress> assocStudentAddresses = new HashSet<AssocStudentAddress>(0);
    
        public MasterAddress() {
        }
    
        public MasterAddress(MasterAddressCountry masterAddressCountry, MasterAddressDistrict masterAddressDistrict,
                MasterAddressState masterAddressState) {
            this.masterAddressCountry = masterAddressCountry;
            this.masterAddressDistrict = masterAddressDistrict;
            this.masterAddressState = masterAddressState;
        }
    
        public MasterAddress(MasterAddressCountry masterAddressCountry, MasterAddressDistrict masterAddressDistrict, MasterAddressState masterAddressState, String houseNum, String streetAddress, String citymandal, String pincode, String addressType, Set<AssocStaffAddress> assocStaffAddresses, Set<AssocStudentAddress> assocStudentAddresses) {
           this.masterAddressCountry = masterAddressCountry;
           this.masterAddressDistrict = masterAddressDistrict;
           this.masterAddressState = masterAddressState;
           this.houseNum = houseNum;
           this.streetAddress = streetAddress;
           this.citymandal = citymandal;
           this.pincode = pincode;
           this.addressType = addressType;
           this.assocStaffAddresses = assocStaffAddresses;
           this.assocStudentAddresses = assocStudentAddresses;
        }
    
        @Id
        @GeneratedValue(strategy = IDENTITY)
    
        @Column(name = "address_id", unique = true, nullable = false)
        public Integer getAddressId() {
            return this.addressId;
        }  
    
        public void setAddressId(Integer addressId) {
            this.addressId = addressId;
        }
    
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "country_id", nullable = false)
        public MasterAddressCountry getMasterAddressCountry() {
            return this.masterAddressCountry;
        }
    
        public void setMasterAddressCountry(MasterAddressCountry masterAddressCountry) {
            this.masterAddressCountry = masterAddressCountry;
        }
    
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "district_id", nullable = false)
        public MasterAddressDistrict getMasterAddressDistrict() {
            return this.masterAddressDistrict;
        }
    
        public void setMasterAddressDistrict(MasterAddressDistrict masterAddressDistrict) {
            this.masterAddressDistrict = masterAddressDistrict;
        }
    
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "state_id", nullable = false)
        public MasterAddressState getMasterAddressState() {
            return this.masterAddressState;
        }
    
        public void setMasterAddressState(MasterAddressState masterAddressState) {
            this.masterAddressState = masterAddressState;
        }
    
        @Column(name = "house_num", length = 45)
        public String getHouseNum() {
            return this.houseNum;
        }
    
        public void setHouseNum(String houseNum) {
            this.houseNum = houseNum;
        }
    
        @Column(name = "street_address", length = 45)
        public String getStreetAddress() {
            return this.streetAddress;
        }
    
        public void setStreetAddress(String streetAddress) {
            this.streetAddress = streetAddress;
        }
    
        @Column(name="citymandal")
        public String getCitymandal() {
            return this.citymandal;
        }
    
        public void setCitymandal(String citymandal) {
            this.citymandal = citymandal;
        }
    
        @Column(name = "pincode", length = 45)
        public String getPincode() {
            return this.pincode;
        }
    
        public void setPincode(String pincode) {
            this.pincode = pincode;
        }
    
        @Column(name = "address_type", length = 9)
        public String getAddressType() {
            return this.addressType;
        }
    
        public void setAddressType(String addressType) {
            this.addressType = addressType;
        }
    
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "masterAddress")
        public Set<AssocStaffAddress> getAssocStaffAddresses() {
            return this.assocStaffAddresses;
        }
    
        public void setAssocStaffAddresses(Set<AssocStaffAddress> assocStaffAddresses) {
            this.assocStaffAddresses = assocStaffAddresses;
        }
    
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "masterAddress")
        public Set<AssocStudentAddress> getAssocStudentAddresses() {
            return this.assocStudentAddresses;
        }
    
        public void setAssocStudentAddresses(Set<AssocStudentAddress> assocStudentAddresses) {
            this.assocStudentAddresses = assocStudentAddresses;
        }
        @Column(name="student_admission_id")  
        public Integer getStudentAdmissionId() {
            return studentAdmissionId;
        }
    
        public void setStudentAdmissionId(Integer studentAdmissionId) {
            this.studentAdmissionId = studentAdmissionId;
        }
        @Column(name="is_same")
        public String getIsSame() {
            return isSame;
        }
    
        public void setIsSame(String isSame) {
            this.isSame = isSame;
        }
    
    }
    

    之间没有依赖关系 学生管理员助理 主地址 . 我只是在用 StudentAdmissinAssoDTO 生成嵌套的JSON对象。 这样我就可以把它们放进 controller

    像贝娄

    MasterAddress  masterAddress =null;
    masterAddress = studentAdmissinAssoDTO.getMasterAddress();
    

    为什么我会得到这个例外

    (http-nio-8017-exec-3:org.springframework.http.converter.json.MappingJackson2HttpMessageConverter):  [org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.logWarningIfNecessary(AbstractJackson2HttpMessageConverter.java:205)] 
      Failed to evaluate Jackson deserialization for type [[simple type, class com.rasvek.cg.entity.StudentAdmissinAssoDTO]]: java.lang.IllegalArgumentException: Can not handle managed/back reference 'defaultReference': no back reference property found from type [collection type; class java.util.Set, contains [simple type, class com.rasvek.cg.entity.MasterAddress]
    

    有人能解释为什么会这样吗?谢谢您!.

    1 回复  |  直到 6 年前
        1
  •  0
  •   bharath    6 年前

    我发现了我的错误,我错放了 @JsonManagedReference 在MasterDistrict级别 MasterAddress