返回一个接口实例数组

时间:2013-07-30 22:14:41

标签: java jaxb glassfish jax-rs jersey-2.0

我正在开发一个小项目,我必须返回一个特定接口实例的数组。当我返回一个接口的单个​​实例时,一切正常。当我返回一个实例数组时,我收到以下错误:

<小时/> 编辑2013年8月2日
如果我使用抽象类,相同的代码可以正常工作。接口似乎是问题所在。


Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of             IllegalAnnotationExceptions
Person is an interface and JAXB cannot handle interfaces 
       est une interface et JAXB ne peut pas gérer les interfaces.
    this problem is related to the following location:
    at Person
Person does not have a default empty constructor 
       ne comporte aucun constructeur sans argument par défaut.
    this problem is related to the following location:
    at Person

如何处理使用JAXB和JAX-RS返回接口实例的数组?

我正在使用Gassfish 4,并尝试了以下方法。数据代码:

@XmlRootElement
public interface Person {
  @XmlAttribute
  public String getId();
  @XmlElement
  public String getName();
}

@XmlRootElement
public class P1 implements Person {

  @Override
  @XmlAttribute
  public String getId() {
    return "1";
  }

  @Override
  @XmlElement
  public String getName() {
    return this.getClass().getSimpleName();
  }
}

@XmlRootElement
public class P2 implements Person {

  @Override
  @XmlAttribute
  public String getId() {
    return "2";
  }

  @Override
  @XmlElement
  public String getName() {
    return this.getClass().getSimpleName();
  }
}

JAX-RS代码:

Person[] persons = {new P1(), new P2()};

@GET
@Path("/query")
@Produces({ MediaType.APPLICATION_JSON })
public Person[] findByQuery(@QueryParam("name") String name) {
  return persons;
}

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试从接口类指向实现类,例如:

@XmlRootElement
@XmlSeeAlso({P1.class, P2.class})
public interface Person {
  @XmlAttribute
  public String getId();
  @XmlElement
  public String getName();
}