Axis2 Web服务客户端生成 - 不修改客户端的类型

时间:2008-10-15 15:43:40

标签: java code-generation axis2 wsdl2java

是否可以使用Axis2和Eclipse生成Web服务客户端,并让它使用您已在包中拥有的java类型,而不是创建自己的类型。原因当然,如果我已经创建了类型A并且它创建了它自己的类型A我不能只将类型A的变量赋值给类型B的变量。

wsdl是从部署到应用程序服务器的Web Service生成的。 如果无法从中生成它,则可以从已存在的java文件生成客户端。

6 个答案:

答案 0 :(得分:3)

如果您真的想重用现有类,可以直接调用Axis2 API而无需使用wsdl2java生成客户端。下面是一些调用Web服务的相对简单的代码。您只需要填写Web服务端点,方法QName,预期返回类和服务参数。您可以重用现有的类作为返回值或参数。

如果您的网络服务非常复杂,那么您可能会发现必须深入了解API才能使这种方法发挥作用。

serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();

EndpointReference targetEPR = new EndpointReference("http://myservice");

options.setTo(targetEPR);

QName methodName = new QName("ns","methodName");

Class<?>[] returnTypes = new Class[] { String.class };

Object[] args = new Object[] { "parameter" };

Object[] response = serviceClient.invokeBlocking(methodName, args,
                returnTypes);

答案 1 :(得分:1)

您正在从wsdl生成Web服务客户端,对吗?

wsdl2java工具唯一知道的是wsdl中的信息,因此它不会知道您已创建的任何类型。

如果您可以将类型信息输入wsdl,您可以使用它,但我从未尝试过。

如果您想要一种简单的方法从A类复制到B类,那么您可以尝试BeanUtils.copyProperties,只要类型A和类型B的setter和getter匹配。

答案 2 :(得分:0)

几乎大多数java webservices项目都经历过这个。我不知道.NET / C#世界是否有更优雅的解决方案。

正如Mike所说,使用BeanUtils.copyProperties是有意义的。

BR,
〜A

答案 3 :(得分:0)

如果您使用eclipse作为您的ide,那就是您所需要的:http://www.eclipse.org/webtools/。它确实超出了你想要的其他东西。

答案 4 :(得分:0)

您可以直接使用ServiceClient类来调用Web服务,该服务仅使用XML进行调用并返回XML响应。对于不同的Web服务方法,您必须将XML响应转换为某些Java POJO才能使用它。只需要在您的最后完成响应处理。你可以做的就是从XML到Map等...

因此,您不需要任何其他存根类来调用任何Web服务,只需要处理响应XML。您可以使用Castor或JAXB库将XML转换为POJO。

这是您不需要每次为diff修改客户端的方式。网页服务。您可以开发为向客户端外部提供响应处理程序。因此,对于每个不同的Web服务,您将拥有差异。响应处理程序类,它是你接口的实现。

//common interface for response handlers...
//implement this for diff. web service/methods
public interface WSRespHandler{
    public Object getMeResp(Object respData);
}


//pass particular handler to client when you call some WS
public class WebServiceClient {
    public Object getResp(WSRespHandler respHandler) {
        ..

        return repHandler.getMeResp(xmlData);
    }
}

参考:

http://www.developer.com/java/web/article.php/3863416/Using-Axis2-and-Java-for-Asynchronous-Web-Service-Invocation-on-the-Client-Side.htm

http://www.devdaily.com/blog/post/java/java-web-service-client-read-array-list/

感谢。

www.techlads.com

答案 5 :(得分:0)

如果这篇文章对某人有用,我会阅读生成客户指南的轴2:http://axis.apache.org/axis2/java/core/docs/userguide-creatingclients.html

似乎Axis2 Eclipse插件配置为在集成模式下调用ADB代码生成(请参阅http://axis.apache.org/axis2/java/core/docs/adb/adb-howto.html),从而在Web服务存根中创建内部类。我不知道是否可以将生成模式更改为扩展模式(从存根类生成数据类),但是您可以使用Wsdl2Java执行命令行:

    %AXIS2_HOME%\bin\WSDL2Java -uri <wsdl file path> -p <package name> -u

-u选项告诉ADB代码生成器将数据类创建为单独的类而不是存根中的内部类。