【问题标题】:How do you marshall a parameterized type with JAX-WS / JAXB?如何使用 JAX-WS / JAXB 编组参数化类型?
【发布时间】:2010-02-17 03:59:00
【问题描述】:

考虑以下类(请假设私有字段的公共 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&lt;Person&gt; 而不是具体类型。所以 getTeachers() 返回的 Result 被序列化为包含 List&lt;Person&gt; 而不是 List&lt;Teacher&gt;,getStudents() 也一样,比照了。

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

谢谢!

LES

【问题讨论】:

  • 你能给出一个生成的 XML 吗?
  • 我实际上使用的是返回 JSON 数据的 JAX-WS JSON 插件。 getTeachers 示例是: {city:"Memphis",group:[{name:"Johnny"}]} 。也就是说,“工资”不会出现。 getStudents 也是如此——它与前面的示例完全一样(当然不会出现)。我现在不在我的开发箱上,这就是为什么我不能发布一个真实的 WSDL 示例或生成的模式或 XML,通过使用 SoapUI 通过 SOAP 访问服务。

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


【解决方案1】:

这个问题的答案相当棘手。事实证明,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 注释的情况下被编组。

【讨论】:

  • 我看到这篇文章已有两年历史了。您目前使用什么来实现带有 JSON 的 WebMethod?
  • 我认为球衣在 Java 诗句中是标准的? (如果您想要宁静的服务)。 spring mvc 也使这变得微不足道,只需在控制器方法上添加 ResponseBody 注释,并在 RequestMapping 注释上指定 application/json 的内容类型。有时我会使用 grails(尽管我并没有完全获胜)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2013-11-05
相关资源
最近更新 更多