将Jax-B与Jax-WS一起使用以返回复杂类型

时间:2011-04-14 14:41:20

标签: java netbeans jaxb jax-ws

我相信你在这里有很多关于这类事情的问题,但我找到的答案似乎都没有解决我遇到的问题,所以我希望我能够得到一些具体的答案。

我有一个由客户端和服务器组成的项目。服务器连接到数据库,客户端可以通过wsdl文件调用服务器中的方法。这工作正常,但服务器只能返回简单的类型和列表。我查找了如何处理自定义类型,并且我被定向到JaxB,这似乎正是我正在寻找的。不幸的是,我对我应该如何使用它感到有点困惑。我正在使用NetBeans IDE(6.9.1),这使得处理wsdl文件变得更容易,尽管我已经读过,一旦你有了wsdl的结尾,从命令行传递复杂的类是相当简单的工作正常吗?

我想要做的是让服务器返回一个类 - 它只包含数据 - 客户端可以读取和使用它。

我做了以下事情,但显然我在某个地方出错了!

  • 我在服务器端有一个名为Customer的类,它是在客户端调用特定方法时构造并返回的。
  • 客户显然无法正确理解此类。
  • 我使用schemagen从Customer类创建XML模式。然后,我使用netbeans向导将架构绑定到客户端中的类。
  • 我想这是我感到困惑的地方。我想从服务器解组xml响应并使用它在客户端上创建一个新对象。我正在使用“jaxbu”netbeans快捷方式扩展为一些代码,但我不确定如何将返回的对象放入unmarshaller。如果这有道理吗?

“jaxbu”生成的代码类似于下面的try块:

javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(c.getClass().getPackage().getName());
javax.xml.bind.Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
c = (CustomerInfo) unmarshaller.unmarshal(new java.io.File("File path"));

如果您需要更多信息,我们将非常感谢您的帮助。请不要犹豫。

谢谢, 马修

2 个答案:

答案 0 :(得分:2)

我不会成为最后答案的最佳帮助,但我刚才提出了类似的问题,并在该问题中指出了有用的方向。就像Blaise Doughan说你需要使用一些东西来浏览xml文档并找到你需要的部分然后从那里编组。

JAXB unmarshaling Ignoring the SOAP Envelope/Header tags

答案 1 :(得分:1)

你不应该直接做jaxb的东西。相反,您将所有复杂类型放在与wsdl关联的模式中(假设您使用的是wsdl)。然后使用各种jaxws工具(wsgen,wsimport)从wsdl生成存根和jaxb类(对于客户端和服务器)。

几乎所有这些都在jaxws tutorials中描述(metro是jaxws的参考实现)。