javax.ws.rs.WebApplicationException:javax.xml.bind.jaxbeexception与链接的异常类[Ljava.lang.Object;
当我执行REST服务方法时,我得到以下异常,我如何解决这个问题?不确定是哪个javax.ws.rs.WebApplicationException:javax.xml.bind.jaxbeexception与链接的异常类[Ljava.lang.Object;,java,hibernate,rest,jpa,jersey,Java,Hibernate,Rest,Jpa,Jersey,当我执行REST服务方法时,我得到以下异常,我如何解决这个问题?不确定是哪个class[Ljava.lang.Object 任何帮助都是值得赞赏的 javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.SAXException2: class [Ljava.lang.Object; nor any of its super cla
class[Ljava.lang.Object
任何帮助都是值得赞赏的
javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: class [Ljava.lang.Object; nor any of its super
class is known to this context.
javax.xml.bind.JAXBException: class [Ljava.lang.Object; nor any of its super
class is known to this context.]
at
com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo
(AbstractRootElementProvider.java:155)
at com.sun.jersey.spi.container.ContainerResponse.write
(ContainerResponse.java:306)
Emp实体
@XmlRootElement
@Entity
@Table(name = "EMP")
@XmlSeeAlso({Emp.class})
@NamedQueries({
@NamedQuery(name = "Emp.findAllEmployees", query = "select e.empno AS empno,e.ename AS ename,e.job as job,e.mgr AS mgr,e.sal AS sal,e.comm as comm,e.dept.deptno as deptno from Emp e left join e.dept order by e.empno desc")
})
public class Emp implements java.io.Serializable {
private short empno;
private Dept dept;
private String ename;
private String job;
private Short mgr;
private Date hiredate;
private Integer sal;
private Integer comm;
public Emp() {
}
public Emp(short empno) {
this.empno = empno;
}
public Emp(short empno, String ename, Dept dept, String job, Short mgr, Date hiredate, Integer sal, Integer comm) {
this.empno = empno;
this.dept = dept;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
this.sal = sal;
this.comm = comm;
}
@Id
@Column(name = "EMPNO", unique = true, nullable = false, precision = 4, scale = 0)
public short getEmpno() {
return this.empno;
}
public void setEmpno(short empno) {
this.empno = empno;
}
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.MERGE)
@JoinColumn(name = "DEPTNO")
public Dept getDept() {
return this.dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Column(name = "ENAME", length = 10)
public String getEname() {
return this.ename;
}
public void setEname(String ename) {
this.ename = ename;
}
@Column(name = "JOB", length = 9)
public String getJob() {
return this.job;
}
public void setJob(String job) {
this.job = job;
}
@Column(name = "MGR", precision = 4, scale = 0)
public Short getMgr() {
return this.mgr;
}
public void setMgr(Short mgr) {
this.mgr = mgr;
}
@Temporal(TemporalType.DATE)
@Column(name = "HIREDATE", length = 7)
public Date getHiredate() {
return this.hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
@Column(name = "SAL", precision = 7)
public Integer getSal() {
return this.sal;
}
public void setSal(Integer sal) {
this.sal = sal;
}
@Column(name = "COMM", precision = 7)
public Integer getComm() {
return this.comm;
}
public void setComm(Integer comm) {
this.comm = comm;
}
}
@XmlRootElement
@XmlSeeAlso({Dept.class})
@Entity
@Table(name="DEPT")
public class Dept implements java.io.Serializable {
private byte deptno;
private String dname;
private String loc;
private Set emps = new HashSet(0);
public Dept() {
}
public Dept(byte deptno) {
this.deptno = deptno;
}
public Dept(byte deptno, String dname, String loc, Set emps) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
this.emps = emps;
}
@Id
@Column(name="DEPTNO", unique=true, nullable=false, precision=2, scale=0)
public byte getDeptno() {
return this.deptno;
}
public void setDeptno(byte deptno) {
this.deptno = deptno;
}
@Column(name="DNAME", length=14)
public String getDname() {
return this.dname;
}
public void setDname(String dname) {
this.dname = dname;
}
@Column(name="LOC", length=13)
public String getLoc() {
return this.loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@OneToMany(fetch=FetchType.LAZY, mappedBy="dept")
public Set<Emp> getEmps() {
return this.emps;
}
public void setEmps(Set emps) {
this.emps = emps;
}
}
部门实体
@XmlRootElement
@Entity
@Table(name = "EMP")
@XmlSeeAlso({Emp.class})
@NamedQueries({
@NamedQuery(name = "Emp.findAllEmployees", query = "select e.empno AS empno,e.ename AS ename,e.job as job,e.mgr AS mgr,e.sal AS sal,e.comm as comm,e.dept.deptno as deptno from Emp e left join e.dept order by e.empno desc")
})
public class Emp implements java.io.Serializable {
private short empno;
private Dept dept;
private String ename;
private String job;
private Short mgr;
private Date hiredate;
private Integer sal;
private Integer comm;
public Emp() {
}
public Emp(short empno) {
this.empno = empno;
}
public Emp(short empno, String ename, Dept dept, String job, Short mgr, Date hiredate, Integer sal, Integer comm) {
this.empno = empno;
this.dept = dept;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
this.sal = sal;
this.comm = comm;
}
@Id
@Column(name = "EMPNO", unique = true, nullable = false, precision = 4, scale = 0)
public short getEmpno() {
return this.empno;
}
public void setEmpno(short empno) {
this.empno = empno;
}
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.MERGE)
@JoinColumn(name = "DEPTNO")
public Dept getDept() {
return this.dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Column(name = "ENAME", length = 10)
public String getEname() {
return this.ename;
}
public void setEname(String ename) {
this.ename = ename;
}
@Column(name = "JOB", length = 9)
public String getJob() {
return this.job;
}
public void setJob(String job) {
this.job = job;
}
@Column(name = "MGR", precision = 4, scale = 0)
public Short getMgr() {
return this.mgr;
}
public void setMgr(Short mgr) {
this.mgr = mgr;
}
@Temporal(TemporalType.DATE)
@Column(name = "HIREDATE", length = 7)
public Date getHiredate() {
return this.hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
@Column(name = "SAL", precision = 7)
public Integer getSal() {
return this.sal;
}
public void setSal(Integer sal) {
this.sal = sal;
}
@Column(name = "COMM", precision = 7)
public Integer getComm() {
return this.comm;
}
public void setComm(Integer comm) {
this.comm = comm;
}
}
@XmlRootElement
@XmlSeeAlso({Dept.class})
@Entity
@Table(name="DEPT")
public class Dept implements java.io.Serializable {
private byte deptno;
private String dname;
private String loc;
private Set emps = new HashSet(0);
public Dept() {
}
public Dept(byte deptno) {
this.deptno = deptno;
}
public Dept(byte deptno, String dname, String loc, Set emps) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
this.emps = emps;
}
@Id
@Column(name="DEPTNO", unique=true, nullable=false, precision=2, scale=0)
public byte getDeptno() {
return this.deptno;
}
public void setDeptno(byte deptno) {
this.deptno = deptno;
}
@Column(name="DNAME", length=14)
public String getDname() {
return this.dname;
}
public void setDname(String dname) {
this.dname = dname;
}
@Column(name="LOC", length=13)
public String getLoc() {
return this.loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@OneToMany(fetch=FetchType.LAZY, mappedBy="dept")
public Set<Emp> getEmps() {
return this.emps;
}
public void setEmps(Set emps) {
this.emps = emps;
}
}
问题似乎是JAX无法将列表封送到XML。您已为Emp类正确定义了XML绑定。可能是JAXB无法处理这些对象的集合。请尝试以下操作: 1) 围绕Emp引入一个包装器类
@XmlRootElement(name="Employess")
public class EmpList {
private List<Emp> emps = new ArrayList<Emp>();
public void setEmpList(List<Emp> facpList) {
this.emps = facpList;
}
@XmlElement(name="Emp")
public List<Emp> getEmpList() {
return emps;
}
}
顺便说一句,这只是一种可能性。也可能是某些嵌套属性不可解析。也就是说,Emp可能有一个属性是具有问题属性的对象。由于您尚未发布所有类的完整源代码,我只能猜测可能是这样。我用实体类代码Emp和部门。我尝试了您的解决方案,其中一个问题是
response.setPayload(emps);
不兼容。因此我转换为response.setPayload((列表)emps)
whcih导致java.lang.ClassCastException:test.entity.EmpList无法转换为java.util.List
不确定如何解决此问题。我做了另一个更改,将负载声明为私有对象负载;
在REST方法中,我做了响应.setPayload(emps)现在的问题是以下异常javax.ws.rs.WebApplicationException:javax.xml.bind.MarshalException-带有链接的异常:[com.sun.istack.SAXException2:class test.entity.EmpList,它的任何超类在此上下文中都不为人所知。
即使我有@xmlseeald(EmpList.class)
在员工列表中定义您找到了解决此问题的方法吗?我遇到了与此场景完全相同的错误
@XmlRootElement(name="Employess")
public class EmpList {
private List<Emp> emps = new ArrayList<Emp>();
public void setEmpList(List<Emp> facpList) {
this.emps = facpList;
}
@XmlElement(name="Emp")
public List<Emp> getEmpList() {
return emps;
}
}
EmpList emps = new EmpList();
emps.setEmpList(getEmployeeService().findAllEmployees());
response.setPayload(emps);