Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Axis2 Web服务客户端生成-在不修改客户端的情况下生成类型_Java_Code Generation_Axis2_Wsdl2java - Fatal编程技术网

Java Axis2 Web服务客户端生成-在不修改客户端的情况下生成类型

Java Axis2 Web服务客户端生成-在不修改客户端的情况下生成类型,java,code-generation,axis2,wsdl2java,Java,Code Generation,Axis2,Wsdl2java,Axis2和Eclipse是否可以生成Web服务客户机,并让它使用包中已有的java类型,而不是创建自己的类型。原因当然是,如果我已经创建了类型A,并且它创建了自己的类型A,我不能只将类型A的变量分配给类型B的变量 wsdl是从部署到应用服务器的Web服务生成的。 如果无法从中生成它,那么可以从现有的java文件生成客户端。您正在从wsdl生成web服务客户端,对吗 wsdl2java工具只知道wsdl中的信息,因此它不知道您已经创建的任何类型 如果您可以将类型信息输入到wsdl中,您就可以让它

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

wsdl是从部署到应用服务器的Web服务生成的。
如果无法从中生成它,那么可以从现有的java文件生成客户端。

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

wsdl2java工具只知道wsdl中的信息,因此它不知道您已经创建的任何类型

如果您可以将类型信息输入到wsdl中,您就可以让它工作,尽管我从未尝试过


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

几乎大多数java Web服务项目都经历了这一过程。我不知道.NET/C世界是否有更优雅的解决方案

正如Mike提到的,使用BeanUtils.copyProperties是有意义的

BR,

~A

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

如果您的web服务相当复杂,那么您可能会发现必须深入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);
serviceClient=new RPCServiceClient();
Options=serviceClient.getOptions();
EndpointReference targetEPR=新的EndpointReference(“http://myservice");
选项。设置为(targetEPR);
QName methodName=新的QName(“ns”、“methodName”);
类[]返回类型=新类[]{String.Class};
对象[]args=新对象[]{“参数”};
Object[]response=serviceClient.InvokeBlock(方法名、参数、,
返回类型);

如果您使用eclipse作为ide,这正是您所需要的:。它所做的事情远远超出了您想要的。

您可以直接使用ServiceClient类调用web服务,它只提供使用XML的调用并返回XML响应。对于不同的web服务方法,您必须将XML响应转换为一些JavaPOJO来使用它。只有响应处理需要在您这边完成。你可以从XML到地图等等

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

对于不同的web服务,您无需每次都修改客户端。您可以像在外部向客户机提供响应处理程序一样进行开发。因此,对于每个不同的web服务,您都将拥有diff.response handler类,它是您接口的实现

//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);
    }
}
参考:

谢谢


www.techlads.com

如果这篇文章对我阅读axis2生成客户端指南的人仍然有用的话:

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

    %AXIS2_HOME%\bin\WSDL2Java -uri <wsdl file path> -p <package name> -u
%AXIS2\u HOME%\bin\WSDL2Java-uri-p-u
u选项告诉ADB代码生成器将数据类创建为单独的类,而不是存根中的内部类