문제

I have this file:

@XmlRootElement(name="Projects")
public class Projects extends ResponseWrapper {
    private ArrayList<Project> project;
    @XmlElement(name="Project")
    public ArrayList<Project> getProject() {
        return project;
    }

    public void setProject(List<Project> list) {
        this.project = (ArrayList<Project>)list;
    }

}

Project has an @XMLInverseReference

  System.out.println(JAXBContext.newInstance(Projects.class).getClass()); //error

Exception Description: The method [setProject] or [getProject] is not defined in the object [com.tps.www.data.Projects].

While printing out Project.class:

 System.out.println(JAXBContext.newInstance(Project.class).getClass()); //OK
20:27:01,118 INFO  [stdout] (http-localhost-127.0.0.1-8180-1) class org.eclipse.persistence.jaxb.JAXBContext



package com.tps.www.data;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlInverseReference;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.NamedQueries;
import org.hibernate.annotations.NamedQuery;

import com.tps.www.util.ResponseWrapper;

@NamedQueries({ 
@NamedQuery(name = "findProjectById", query = "select p from Project p where p.projectCode = ?"),
@NamedQuery(name="findAllProject",query="from Project p")})

@Entity
@Table(name = "Project")
@XmlRootElement(name = "Project",namespace="http://www.w3.org/2001/XMLSchema-instance")
public class Project extends ResponseWrapper implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "Project_Code")
    private String projectCode;

    @Column(name = "Project_Name")
    private String projectName;
    @Column(name = "Starting_Date")
    private Date startingDate;
    @Column(name = "Expected_End_Date")
    private Date expectedEndDate;
    @Column(name = "Created_By")
    private String createdBy;

    @LazyCollection(LazyCollectionOption.FALSE)
    @OneToOne(mappedBy = "project",fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    private Contract contract;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "Service_Id")
    private Service service;

    @OneToOne(mappedBy = "project",fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    private BudgetRequestInfo budgetRequestInfo;
    @LazyCollection(LazyCollectionOption.FALSE)
    @OneToMany(mappedBy = "project",cascade=CascadeType.ALL)
    private List<MaterialRequestAssignment> materialRequestAssignment;

    @XmlElement(name = "Project_Code", nillable=true)
    public String getProjectCode() {
        return projectCode;
    }

    public void setProjectCode(String projectCode) {
        this.projectCode = projectCode;
    }

    @XmlElement(name = "Project_Name", nillable=true)
    public String getProjectName() {
        return projectName;
    }

    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }

    @XmlElement(name = "Starting_Date", nillable=true)
    public Date getStartingDate() {
        return startingDate;
    }

    public void setStartingDate(Date startingDate) {
        this.startingDate = startingDate;
    }

    @XmlElement(name = "Expected_End_Date", nillable=true)
    public Date getExpectedEndDate() {
        return expectedEndDate;
    }

    public void setExpectedEndDate(Date expectedEndDate) {
        this.expectedEndDate = expectedEndDate;
    }

    @XmlElement(name = "Created_By", nillable=true)
    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    @XmlElement(name = "Contract", nillable=true)
    @XmlInverseReference(mappedBy="project")
    public Contract getContract() {
        return contract;
    }

    public void setContract(Contract contract) {
        this.contract = contract;
    }

    @XmlElement(name = "Service_Id", nillable=true)
    @XmlInverseReference(mappedBy="project")
    public Service getService() {
        return service;
    }

    public void setService(Service service) {
        this.service = service;
    }

    @XmlElement(name = "Budget_Request_Info", nillable=true)
    @XmlInverseReference(mappedBy="project")
    public BudgetRequestInfo getBudgetRequestInfo() {
        return budgetRequestInfo;
    }

    public void setBudgetRequestInfo(BudgetRequestInfo budgetRequestInfo) {
        this.budgetRequestInfo = budgetRequestInfo;
    }
    @XmlElement(name = "Material_Request_Assignment", nillable=true)
    @XmlInverseReference(mappedBy="project")
    public List<MaterialRequestAssignment> getMaterialRequestAssignment() {
        return materialRequestAssignment;
    }

    public void setMaterialRequestAssignment(
            List<MaterialRequestAssignment> materialRequestAssignment) {
        this.materialRequestAssignment = materialRequestAssignment;
    }




}
도움이 되었습니까?

해결책

Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-22) expert group.

I have not been able to reproduce the issue you are seeing. Could you help provide more information so that I can reproduce the problem? Here is what I have tried:

  1. Removed JPA & Hibernate annotations from Project class to get it to compile.
  2. Created empty ResponseWrapper class for Project and Projects to extend.
  3. Created classes for each class referenced by Project.
  4. When a property is marked with @XmlInverseReference added the project property on the corresponding type:

    public class Contract {
    
        private Project project;
    
        public Project getProject() {
            return project;
        }
    
        public void setProject(Project project) {
            this.project = project;
        }
    
    }
    
  5. Ran the following demo code:

    import java.io.File;
    import javax.xml.bind.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Projects.class);
    
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            File xml = new File("src/forum19953731/input.xml");
            Projects projects = (Projects) unmarshaller.unmarshal(xml);
        }
    
    }
    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top