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

Java 如何使用JAX-WS/JAXB处理参数化类型?,java,generics,jaxb,jax-ws,web-services,Java,Generics,Jaxb,Jax Ws,Web Services,考虑以下类(请假定私有字段使用公共getter和setter方法) //包含一组属性 公共抽象类Person{private String name;} //添加一些特定于教师的属性 公共班级教师扩展个人{私人int工资;} //添加一些特定于学生的属性 公共班级学生扩展个人{私人字符串课程;} //添加一些适用于整个人群的属性 公开课成绩{ 私有列表组; 私人城市; // ... } 我们可能将以下web服务实现注释如下: @WebService public class PersonSer

考虑以下类(请假定私有字段使用公共getter和setter方法)

//包含一组属性
公共抽象类Person{private String name;}
//添加一些特定于教师的属性
公共班级教师扩展个人{私人int工资;}
//添加一些特定于学生的属性
公共班级学生扩展个人{私人字符串课程;}
//添加一些适用于整个人群的属性
公开课成绩{
私有列表组;
私人城市;
// ...
}
我们可能将以下web服务实现注释如下:

@WebService
public class PersonService {

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

    @WebMethod
    public Result<Student> getStudents() { ... }
}
@WebService
公共类人员服务{
@网络方法
公共结果getTeachers(){…}
@网络方法
公共结果getStudents(){…}
}
问题在于,JAXB似乎将结果对象作为
Result
而不是具体类型进行编组。因此,getTeachers()返回的结果被序列化为包含一个
列表,而不是
列表,getStudents()的结果也一样,经过必要的修改

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

谢谢


LES

这个问题的答案相当棘手。事实证明,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在这种情况下工作得非常出色

找到指向我阅读的论坛的链接:。请注意,Collab.net当前处于停机状态,需要进行维护,但很快就会恢复


至于回答一般性问题(没有JAX-WSJSON插件部分),答案是肯定的——您必须在Person类上使用@XMLSeeAllow注释。否则,模式将只包含Person而不包含Teacher或Student元素。只有亲自定义的元素在没有@xmlseeald注释的情况下被编组。

这个问题的答案相当棘手。事实证明,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在这种情况下工作得非常出色

找到指向我阅读的论坛的链接:。请注意,Collab.net当前处于停机状态,需要进行维护,但很快就会恢复


至于回答一般性问题(没有JAX-WSJSON插件部分),答案是肯定的——您必须在Person类上使用@XMLSeeAllow注释。否则,模式将只包含Person而不包含Teacher或Student元素。只有亲自定义的元素在没有@xmlseeals注释的情况下被编组。

您能给出结果XML吗?我实际上使用的是返回JSON数据的JAX-WS JSON插件。getTeachers示例的一个示例是:{city:“孟菲斯”,组:[{name:“Johnny”}]}。也就是说,“工资”不会出现。getStudents也一样-它与前面的示例完全相同(课程不会显示)。我现在不在我的开发框中,这就是为什么我不能发布通过SOAP使用SoapUI访问服务的WSDL或生成的模式或XML的真实示例。你能给出结果XML吗?我实际上使用的是返回JSON数据的JAX-WS JSON插件。getTeachers示例的一个示例是:{city:“孟菲斯”,组:[{name:“Johnny”}]}。也就是说,“工资”不会出现。getStudents也一样-它与前面的示例完全相同(课程不会显示)。我现在不在我的开发框中,这就是为什么我不能发布一个通过SOAP使用SoapUI访问服务的WSDL或生成的模式或XML的真实示例的原因。您目前使用什么来实现带有JSON的WebMethod?我认为jersey在java版本中是标准的?(如果您想要restful服务)。SpringMVC也让这变得微不足道,只需在控制器方法上添加ResponseBody注释,并在RequestMapping注释上为application/json指定内容类型。有时我会使用grails(尽管我还没有完全赢)。我看到这篇文章已经有两年了。您目前使用什么来实现带有JSON的WebMethod?我认为jersey在java版本中是标准的?(如果您想要restful服务)。SpringMVC也让这变得微不足道,只需在控制器方法上添加ResponseBody注释,并在RequestMapping注释上为application/json指定内容类型。诸如此类
@WebService
public class PersonService {

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

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