java wsdl 哪些 wsdl 元素被解析为 java 类?

标签 java class wsdl

我使用 eclipse 并有一个 wsdl。我从这个 wsdl 生成了 java 类。但我没有每个 wsdl 元素(请求元素)

wsdl 是:

<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:DefaultNameSpace" xmlns:apachesoap="http://xml.apache.org/xml-soap"
 xmlns:impl="urn:DefaultNameSpace" xmlns:intf="urn:DefaultNameSpace" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:DefaultNameSpace">
            <element name="LINEAS" type="xsd:string"/>
            <element name="TRAMOS" type="xsd:string"/>
            <element name="CODUSUARIO" type="xsd:string"/>
            <element name="NOMUSUARIO" type="xsd:string"/>
            <complexType name="LISTADO">
                <sequence>
                    <element name="RESULTADO" type="xsd:string"/>
                    <element name="MSG" type="xsd:string"/>
                </sequence>
            </complexType>
            <element name="LISTADODOCUMENTOSReturn" type="impl:LISTADO"/>
            <complexType name="Elemento1">
               <sequence>
                   <element name="LINEAS1" type="xsd:string"/>
                   <element name="TRAMOS1" type="xsd:string"/>
                   <element name="CODUSUARIO1" type="xsd:string"/>
                   <element name="NOMUSUARIO1" type="xsd:string"/>
               </sequence>
           </complexType>
           <element name="Elemento2" type="impl:Elemento1"/>
        </schema>

    </wsdl:types>
    <message name="LISTADODOCUMENTOSRequest">
        <part name="elementorequest"  element="impl:Elemento2"/>
    </message>
    <message name="LISTADODOCUMENTOSResponse">
        <part element="impl:LISTADODOCUMENTOSReturn" name="LISTADODOCUMENTOSReturn"/>
    </message>
    <portType name="DegradadoMercanciasNotes">
        <operation name="LISTADODOCUMENTOS">
            <input message="impl:LISTADODOCUMENTOSRequest" name="LISTADODOCUMENTOSRequest"/>
            <output message="impl:LISTADODOCUMENTOSResponse" name="LISTADODOCUMENTOSResponse"/>
        </operation>
    </portType>
    <binding name="DominoSoapBinding" type="impl:DegradadoMercanciasNotes">
        <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="LISTADODOCUMENTOS">
            <wsdlsoap:operation soapAction=""/>
            <input name="LISTADODOCUMENTOSRequest">
                <wsdlsoap:body use="literal"/>
            </input>
            <output name="LISTADODOCUMENTOSResponse">
                <wsdlsoap:body use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="DegradadoMercanciasNotesService">
        <port binding="impl:DominoSoapBinding" name="Domino">
            <wsdlsoap:address location="http://seguriteca.sir.renfe.es:80/u35/GDN/Seguriteca2017/Normativa.nsf/DegradadoMercancias?OpenWebService"/>
        </port>
    </service>
</definitions>

我从 eclipse 生成了 java 类。我想问一个问题。哪些 wsdl' 元素被转换为 java 类?因为在我的 java 类中我没有看到

<message name="LISTADODOCUMENTOSRequest">
        <part name="elementorequest"  element="impl:Elemento2"/>
    </message>

也不

<element name="Elemento2" type="impl:Elemento1"/>

已编辑

我的问题出在 WSDL'元素

<message name="LISTADODOCUMENTOSRequest">
        <part element="impl:LINEAS" name="LINEAS" />
        <part element="impl:TRAMOS" name="TRAMOS" />
        <part element="impl:CODUSUARIO" name="CODUSUARIO" />
        <part element="impl:NOMUSUARIO" name="NOMUSUARIO" />
    </message>

当我尝试生成 java 类时,此元素中发生错误。

最佳答案

几个月前我就遇到了这个问题。我花了大约一周左右的时间试图让它发挥作用。

我尝试了大多数可用的 IDE,它们全部都未能生成所有有效的类,NetBeans 是一个异常(exception); NetBeans 的工作方式与 Eclipse 和 IntelliJ 不同,因此我建议您转移所有涉及SOAP 请求创建通用 WSDL 操作的 wsdl 相关 转到 NetBeans。

然后,您将能够解析响应并发送请求,就像您希望在 Eclipse 中执行的操作一样,但在 NetBeans 中;但是,这意味着将其作为独立的 fat jar,其中包含与 XML 解析等相关的所有依赖项,您将能够用作 Eclipse 项目中的依赖项

在操作国家铁路的开源数据源时,这对我来说是一个非常延迟的过程,但希望以下内容可以帮助您更快地解决问题!

使用 JAX WS 生成类:
1.https://netbeans.org/kb/docs/websvc/client.html

在 NetBeans 中创建远程 jar:
1.导航到文件资源管理器等
2.找到build.xml并右键单击
3. 将鼠标悬停在“运行目标”上
4. 将鼠标悬停在“其他目标”上
5. 单击“clean-and-fat-jar”

这样做将为您提供生成良好的类,您可以使用以下类向其发送请求(注意,我没有更改项目中的默认 header 等,因此您可以引用它们,只需将它们替换为所需的内容即可) !)

请注意:为了方便起见,我已经反射(reflect)了 Jax WS 生成的相当数量的请求类的函数名称被命名为“create{ bla bla}请求”等。

public class SoapRequest {

    private final SOAPMessage request;
    private final String actionString;

    public SoapRequest(Action action, Document generatedRequestAsDoc) throws SOAPException {
        this.actionString = action.getActionString();
        MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
        SOAPMessage soapMessage = messageFactory.createMessage();
        SOAPPart soapPart = soapMessage.getSOAPPart();

        // SOAP Envelope
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration("ldb", "http://thalesgroup.com/RTTI/2017-10-01/ldb/");
        envelope.addNamespaceDeclaration("typ", "http://thalesgroup.com/RTTI/2013-11-28/Token/types");

        envelope.getHeader().
                addHeaderElement(new QName("http://thalesgroup.com/RTTI/2013-11-28/Token/types", "AccessToken")).
                addChildElement("typ:TokenValue").
                addTextNode(getTokenValue());
        soapMessage.getMimeHeaders().addHeader("Content-type", "application/soap+xml;charset=UTF-8;action=" + createSoapAction(getActionString(), false));
        soapMessage.getMimeHeaders().addHeader("Accept-encoding", "gzip, x-gzip, deflate, x-bzip2");

        soapMessage.getMimeHeaders().addHeader("SOAPAction", "http://thalesgroup.com/RTTI/2017-10-01/ldb/ " + createSoapAction(getActionString(), true));

        soapMessage.getSOAPBody().addDocument(generatedRequestAsDoc); //adding the generated request by jax client to the body

        soapMessage.saveChanges();
        this.request = soapMessage;
    }

    private static String createSoapAction(String action, boolean appendRequest) {
        return action + (appendRequest ? "Request" : "");
    }

    private static Document getMarshalledDocument(JAXBElement<?> element, JAXBContext jaxbContext) {
        Document document = getEmptyDoc();
        try {
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(element, document);
        } catch (JAXBException e) {
            Logger.getLogger(IdealTrains.class.getName()).log(Level.SEVERE, null, e);
            document = null;
        }
        return document;
    }

    @Nullable
    public static Document generateDoc(JAXBElement<?> element) {
        Class elementClass = element.getDeclaredType();
        Document generatedDoc = null;
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(elementClass);
            generatedDoc = getMarshalledDocument(element, jaxbContext);
            if (generatedDoc == null) {
                System.out.println("Could not marshall, terminating...");
                return null;
            }
            return generatedDoc;
        } catch (JAXBException ex) {
            Logger.getLogger(SoapRequest.class.getName()).log(Level.SEVERE, null, ex);
        }

        return generatedDoc;
    }

    @Nullable
    public SoapResponse sendRequestForResponse() {
        try {
            // Create SOAP Connection
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection soapConnection = soapConnectionFactory.createConnection();

            // Send SOAP Message to SOAP Server
            SOAPMessage soapResponse = soapConnection.call(getRequest(), IdealTrains.STAFF_WEBSERVICE_ENDPOINT);
            soapConnection.close();
            return new SoapResponse(soapResponse);
        } catch (UnsupportedOperationException | SOAPException e) {
            System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n");
            e.printStackTrace();
            return null;
        }
    }

    private static Document getEmptyDoc() {
        Document document = null;
        try {
            document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(IdealTrains.class.getName()).log(Level.SEVERE, null, ex);
        }
        return document;
    }

    private static String getTokenValue() {
        return IdealTrains.AUTHENTICATION_TOKEN;
    }

    private SOAPMessage getRequest() {
        return this.request;
    }

    public String getActionString() {
        return actionString;
    }

    public String getResponseString() {
        return getActionString() + "Response";
    }
}

public class Action {

    private final Object objectFactory;
    private final String response;
    private String actionString;
    private Service.ServiceType serviceType;

    public Action(Object objectFactory, String getString, Service.ServiceType serviceType) {
        this.actionString = getString;
        this.objectFactory = objectFactory;
        this.response = getString + "Response";
        this.serviceType = serviceType;
    }

    public JAXBElement<?> doParams(Object genericType) {
        String functionNameInFacClass = "create" + getActionString() + "Request";
        Method func = null;
        Class gTypeClass = genericType.getClass();
        Object invokedResponse = null;
        try {
            func = getObjectFactory().getClass().getMethod(functionNameInFacClass, gTypeClass);
            invokedResponse = func.invoke(getObjectFactory(), genericType); //Invoke createACTIONRequest in suitable object factory
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
            ex.printStackTrace();
        }
        JAXBElement<?> element = (JAXBElement<?>) invokedResponse;
        return element;
    }

    public Object getObjectFactory() {
        return objectFactory;
    }

    public String getActionString() {
        return actionString;
    }

    public String getResponse() {
        return response;
    }

    public Service.ServiceType getServiceType() {
        return this.serviceType;
    }

    public void setServiceType(Service.ServiceType serviceType) {
        this.serviceType = serviceType;
    }

    public void setAction(String actionString) {
        this.actionString = actionString;
    }
}

关于java wsdl 哪些 wsdl 元素被解析为 java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57091797/

相关文章:

C# 在类之间传递数据

python - 从现有 WSDL 构建 Django WebService

wcf - wcf 服务上的 wsHttpBinding 和客户端上的 Web 引用不起作用

java - 是否有来自现有 wsdl 文件的 Java/Android 中使用的数据类的类生成器?

java - 在 Spring 中混合 web.xml 和 AbstractAnnotationConfigDispatcherServletInitializer

java - 关闭来自 R2DBC 池的连接

java - Android - 从 assets\PDF 显示访问文件

java - 更改Gradle Project的文件夹结构时,线程 “main” java.lang.ExceptionInInitializerError中的异常

java - 应用程序中的每个 Java 类是否需要有不同的唯一序列版本 ID?

c++ - 定义与声明类