1

在编写 Web 服务时,我似乎遇到了 Java 和 NetBeans 的问题。我已经搜索了几天没有运气,找到与我相同问题的人零回复。

我创建了一个返回复杂类型 (LoginReply) 的 Web 服务,该复杂类型包含另一个复杂类型 (AppInfo) 的数组

但是,当我由此生成 WSDL 时,XSD 中的复杂类型定义为空白,手动添加信息仍然会使 Web 服务返回 null,即使数据已成功传递给 Web 服务。

<xs:complexType name="appInfo">
<xs:sequence/>
</xs:complexType>

登录回复:http: //pastebin.com/Umx6ayvi 应用信息:http : //pastebin.com/566WnZ4H

如果有人能指出我做错了什么,或者如果这是 NetBeans 的一个错误,我是 Java 新手,所以我不能排除我只是不理解某些东西,但我接近拉我的头发在这里。

编辑:

刚刚注意到,当我通过 NetBeans 部署到 tomcat 时,出现以下错误:

WARNING: duplicate class definition bug occured? Please report this :    uk/co/example/ComplexTypes/LoginReply$JaxbAccessorM_getApplications_setApplications_[Luk_co_example_ComplexTypes_AppInfo;

java.lang.ClassFormatError: Illegal class name "uk/co/example/ComplexTypes/LoginReply$JaxbAccessorM_getApplications_setApplications_[Luk_co_example_ComplexTypes_AppInfo;" in class file uk/co/example/ComplexTypes/LoginReply$JaxbAccessorM_getApplications_setApplications_[Luk_co_example_ComplexTypes_AppInfo;

注意 co_uk_example 之前的随机 L。我的研究表明这是一个应该修复的旧错误,并且一年多来没有其他人报告过这个问题,不知道从哪里开始。

另一个编辑:

刚刚在服务上添加了一个新的 web 方法,它只是获取 appInfo 列表并将其返回给客户端。这仍然以同样的方式失败,NetBeans 拒绝在 AppInfo 中生成序列。我确定我错过了声明课程的内容,但我已经检查了无数次以确保我没有遗漏任何内容。

4

3 回答 3

1

警告给你很好的提示:“警告:出现重复的类定义错误”

  • 您的 ws 实现类直接使用直接使用 AppInfo 的 LoginReply 类(+您也可能在您的 ws 实现中直接使用此类)=> jaxb 找到它
  • @XMLSeeAlso(...) 告诉 jaxb “链接”引用的类

=> 同一类的两个定义(不确定是设计使然还是 jaxb 无法更优雅地处理这种情况的错误)

要解决这个问题,只需从 LoginReply 类中删除 @XmlSeeAlso 就可以了

于 2012-10-17T16:32:35.590 回答
1

这个问题归结为一个非常简单的错误。AppInfo 类使用了非标准的 getter 和 setter。

public void SetAppID(int AppID)
{
    this.AppID = AppID;
}

这是不正确的(注意集合上的大写字母),它应该是:

public void setAppID(int AppID)
{
    this.AppID = AppID;
}

使用大写字母不是 JavaBeans 的标准,因此 JAX-WS 不知道如何为此类生成 WSDL。也感谢以下链接中的 shyam 回答问题

如何在 JAX-WS Web 服务中返回自定义复杂类型?

于 2012-10-18T13:51:45.483 回答
-1

我认为您不能在 http 协议中通过网络(编程端口类型)发送“复杂类型”,但是数组可能会隐式转换为分隔字符串集,请检查文档以进行数据传输。

于 2012-10-16T10:10:52.543 回答