我对webservices有点新鲜。我正在使用Netbeans 7.0和Axis2。我有Java服务器端代码和Java客户端。为了简化这一点,我将使用一个非常简单的例子。
我有一个WorkSite类,它有workSiteId,workSiteName和refCode字段,每个字段都有一个getter和setter。在服务器端,该类还有一个重写的toString()方法,它只返回workSiteName。因此,如果我使用JComboBox创建GUI服务器端并开始向其添加WorkSite对象,则workSiteName将显示在JComboBox中,用于每个对象。
所以我基本上创建了一个像“getWorkSiteList”这样的Web方法,它从数据库中查询,创建WorkSite对象并将它们添加到数组中,然后返回数组。我可以毫无问题地使用WorkSite对象,除了当我在Netbeans中查看客户端Jax-WS“Generated Sources”时,getter和setter都在那里,但是toString()方法不存在。因此,当我将WorkSite对象从数组中取出并放入JComboBox时,组合框会为每个项目显示非常难看的内容,例如“examplepackagename.WorkSite.a6d35”,而不是很好并显示workSiteName。
我想我真正的问题是,我在Netbeans的客户端有一个自动生成的WorkSite.java文件没有我的toString()方法(这称为骨架对吗?);有没有办法让它包含在服务器端类定义的toString()方法?如果没有,编辑自动生成的类是否安全(再次,我认为这称为骨架,对吗?)并且只添加我的toString()方法?如果我在客户端编辑自动生成的类,它会在重建时被覆盖吗?
感谢您的帮助!我希望这不是太长时间的啰嗦;我只是不知道所有术语还是以简洁的方式解释它。
答案 0 :(得分:2)
实现此目的的方法是修改Axis2代码生成器的模板。如果查看this page上的体系结构图,您将看到代码生成器以XML格式生成中间数据结构,然后使用XSLT和一组特定于语言的模板来发出代码。如果您希望代码包含额外的toString()
方法,那么显而易见的方法是修改模板以包含对这些方法的支持。
注意事项:
您需要了解生成器的体系结构和实现,以及它使用的技术:特别是XSLT。
我无法保证中间XML文件中有足够的信息来生成您需要的方法。 (我希望会有,但我没看过。)
答案 1 :(得分:0)
正如我在评论中提到的,我通过将示例WorkSite类继承给SubWorkSite类来解决这个问题,该类除了定义返回super.getWorkSiteName.getValue()的覆盖toString()方法之外什么都不做。
所以我有一个从webservice调用返回的WorkSite对象列表,我只是遍历它,对于列表中的每个WorkSite对象,我创建一个SubWorkSite对象并将其添加到JComboBox。现在运行应用程序时,workSiteName显示在JComboBox中,而不是从自动生成的类中获得的丑陋的toString()值“examplepackagename.WorkSite.xxxxx”。
如果有人有任何建议,我当然愿意以更好的方式做到这一点。或者如果有人有关于Stephen C建议编辑生成器XSLT模板的更多信息。