考虑以下类(请假设私有(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/