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

如何使用JAX-WS/JAXB处理参数化类型?

  •  2
  • les2  · 技术社区  · 16 年前

    考虑下面的类(请假设私有字段的公共吸气剂和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;
       // ...
    }
    

    @WebService
    public class PersonService {
    
        @WebMethod
        public Result<Teacher> getTeachers() { ... }
    
        @WebMethod
        public Result<Student> getStudents() { ... }
    }
    

    问题在于,JAXB似乎将结果对象作为 Result<Person> 而不是混凝土类型。因此,getTeachers()返回的结果被序列化为包含 List<Person> 而不是 List<Teacher> ,getStudents()也一样,但需作必要的修改。

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

    谢谢

    1 回复  |  直到 16 年前
        1
  •  0
  •   les2    16 年前

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

    我在某个论坛上读到(没有链接-这都是内存中的链接)没有积极维护jax ws json插件。如果您尝试1)从jax ws json依赖项中排除默认的抛弃依赖项(假设这里是maven)并添加一个更新的版本,您会得到一个关于JSONException不存在的错误。Jax-ws-json不能与更新版本的抛弃(我尝试过)一起使用。

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

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

    找到论坛的链接我读到: http://forums.java.net/jive/thread.jspa?messageID=384385