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

标签 java generics jaxb jax-ws web-services

考虑以下类(请假设私有(private)字段使用公共(public) 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 吗?

谢谢!

学习

最佳答案

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

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

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

最后,我改用 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 注释的情况下被编码。

关于java - 如何使用 JAX-WS/JAXB 编码参数化类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278213/

相关文章:

Java 递归函数有时有效

java - 一个 POI 相关的代码块运行得非常慢

java - 如何调用祖父类的构造函数?

java - 我不确定如何修复堆栈溢出错误

java - 如何在Java 8中传递多个参数和一个函数,然后执行带参数的函数?

jaxb - JAXB 编码对象 : javax. xml.bind.JAXBException : class . .. 或其任何父类(super class)的问题在此上下文中已知

java - 如何使用jaxb将包含相同元素的不同类型映射到单个java类对象

java - 如何修复 JAXB 上下文的 newInstance 中的 nullPointerException

c# - 如何创建从实现接口(interface)的基类派生的实例列表?

嵌套 HashMap 中的java泛型/继承