如何使用JAX-WS / JAXB编组参数化类型?

时间:2010-02-17 03:59:01

标签: java generics jaxb jax-ws web-services

考虑以下类(请假设私有字段的公共getter和setter方法)。

// contains a bunch of properties
public abstract class Person { private String name; }

// adds some properties specific to teachers
public class Teacher extends Person { private int salary; }

// adds some properties specific to students
public class Student extends Person { private String course; }

// adds some properties that apply to an entire group of people
public class Result<T extends Person> {
   private List<T> group;

   private String city;
   // ...
}

我们可能会按如下方式对以下Web服务实现进行注释:

@WebService
public class PersonService {

    @WebMethod
    public Result<Teacher> getTeachers() { ... }

    @WebMethod
    public Result<Student> getStudents() { ... }
}

问题是JAXB似乎将Result对象编组为Result<Person>而不是具体类型。因此,getTeachers()返回的结果被序列化为包含List<Person>而不是List<Teacher>,并且对于getStudents()也是如此,经过必要的修改后。

这是预期的行为吗?我是否需要在Person上使用@XmlSeeAlso?

谢谢!

LES

1 个答案:

答案 0 :(得分:0)

这个问题的答案相当棘手。事实证明,jax-ws json插件使用的jettison版本有点旧(1.0-beta-1 IIRC)。该特定版本不能很好地处理这种情况(它崩溃)。如果你确实添加了@XmlSeeAlso,那么JSON编组将崩溃!当然,这很糟糕!

我在一些论坛上阅读(没有链接 - 这都是来自内存)jax-ws json插件没有被主动维护。如果你试图1)从jax-ws json依赖项中排除默认的jettison依赖项(假设maven在这里)并添加一个更新的版本,你会得到一个关于JSONException不存在的错误。 Jax-ws json不适用于更新版本的jettison(我试过)。

这是在另一个网站上记录的(有人说他们希望有人将jax-ws json移植到最新的喷射器上)。

最后,我切换到DWR进行远程处理。 JAX-WS最适合系统到系统(后端)集成。这对于前端的东西来说太重了。在这种情况下,DWR工作得非常好。

找到论坛的链接我读到:http://forums.java.net/jive/thread.jspa?messageID=384385。请注意,Collab.net目前正在维护,但很快就会恢复。

就回答一般问题(没有JAX-WS JSON插件部分),答案是肯定的 - 你必须在Person类上使用@XmlSeeAlso注释。否则,架构将只包含Person而不包含Teacher或Student元素。只有在Person中定义的元素在没有@XmlSeeAlso注释的情况下进行编组。