无法通过wsimport生成的源中具有类路径方案的URL的getResource

问题描述 投票:0回答:1

我正在使用wsimportjaxws-maven-plugin),并且所生成的源在类路径上查找WSDL文件时存在问题。我将classpath:numberconversion.wsdl用作wsdlLocation,这种wsdlLocation样式可在另一个可以在我的机器上建立OK的项目中工作,但不能在我的最小项目中使用。

这里是main

import java.math.BigInteger;
import test.wsimport.numberconversion.NumberConversion;

public class Something {
    public static void main(String[] args) {

        Something.class.getResource("classpath:numberconversion.wsdl"); // null - why?
        Something.class.getResource("numberconversion.wsdl"); // null - why?
        Something.class.getClassLoader().getResource("classpath:numberconversion.wsdl"); // null - why?
        Something.class.getClassLoader().getResource("numberconversion.wsdl"); // absolute path to WSDL

        new NumberConversion().getNumberConversionSoap().numberToWords(new BigInteger("42"))); // WebServiceException

    }
}

WebServiceException出现在生成的源中:

NUMBERCONVERSION_WSDL_LOCATION = test.wsimport.numberconversion.NumberConversion.class
        .getResource("classpath:numberconversion.wsdl");
WebServiceException e = null;
if (NUMBERCONVERSION_WSDL_LOCATION == null) {
    e = new WebServiceException(
        "Cannot find 'classpath:numberconversion.wsdl' wsdl. Place the resource correctly in the classpath.");
}

为什么生成的源不起作用?


作为参考,如果您想重现错误,这里是pom.xml和WSDL。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>wsimport</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <build><plugins><plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.5</version>
    <executions><execution>
      <id>wsimport</id>
      <goals><goal>wsimport</goal></goals>
      <configuration>
        <wsdlFiles><wsdlFile>numberconversion.wsdl</wsdlFile></wsdlFiles>
        <wsdlDirectory>src/main/resources</wsdlDirectory>
        <wsdlLocation>classpath:numberconversion.wsdl</wsdlLocation>
        <sourceDestDir>src/main/java</sourceDestDir>
        <packageName>test.wsimport.numberconversion</packageName>
      </configuration>
    </execution></executions>
  </plugin></plugins></build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://www.dataaccess.com/webservicesserver/" name="NumberConversion" targetNamespace="http://www.dataaccess.com/webservicesserver/">
  <types>
    <xs:schema elementFormDefault="qualified" targetNamespace="http://www.dataaccess.com/webservicesserver/">
      <xs:element name="NumberToWords">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ubiNum" type="xs:unsignedLong"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="NumberToWordsResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="NumberToWordsResult" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="NumberToDollars">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="dNum" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="NumberToDollarsResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="NumberToDollarsResult" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </types>
  <message name="NumberToWordsSoapRequest">
    <part name="parameters" element="tns:NumberToWords"/>
  </message>
  <message name="NumberToWordsSoapResponse">
    <part name="parameters" element="tns:NumberToWordsResponse"/>
  </message>
  <message name="NumberToDollarsSoapRequest">
    <part name="parameters" element="tns:NumberToDollars"/>
  </message>
  <message name="NumberToDollarsSoapResponse">
    <part name="parameters" element="tns:NumberToDollarsResponse"/>
  </message>
  <portType name="NumberConversionSoapType">
    <operation name="NumberToWords">
      <documentation>Returns the word corresponding to the positive number passed as parameter. Limited to quadrillions.</documentation>
      <input message="tns:NumberToWordsSoapRequest"/>
      <output message="tns:NumberToWordsSoapResponse"/>
    </operation>
    <operation name="NumberToDollars">
      <documentation>Returns the non-zero dollar amount of the passed number.</documentation>
      <input message="tns:NumberToDollarsSoapRequest"/>
      <output message="tns:NumberToDollarsSoapResponse"/>
    </operation>
  </portType>
  <binding name="NumberConversionSoapBinding" type="tns:NumberConversionSoapType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="NumberToWords">
      <soap:operation soapAction="" style="document"/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
    <operation name="NumberToDollars">
      <soap:operation soapAction="" style="document"/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <binding name="NumberConversionSoapBinding12" type="tns:NumberConversionSoapType">
    <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="NumberToWords">
      <soap12:operation soapAction="" style="document"/>
      <input>
        <soap12:body use="literal"/>
      </input>
      <output>
        <soap12:body use="literal"/>
      </output>
    </operation>
    <operation name="NumberToDollars">
      <soap12:operation soapAction="" style="document"/>
      <input>
        <soap12:body use="literal"/>
      </input>
      <output>
        <soap12:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="NumberConversion">
    <documentation>The Number Conversion Web Service, implemented with DataFlex, provides functions that convert numbers into words or dollar amounts.</documentation>
    <port name="NumberConversionSoap" binding="tns:NumberConversionSoapBinding">
      <soap:address location="http://www.dataaccess.com/webservicesserver/numberconversion.wso"/>
    </port>
    <port name="NumberConversionSoap12" binding="tns:NumberConversionSoapBinding12">
      <soap12:address location="http://www.dataaccess.com/webservicesserver/numberconversion.wso"/>
    </port>
  </service>
</definitions>
java classloader wsimport
1个回答
0
投票

事实证明,classpath:方案是Spring添加的,如果没有Spring在类路径和已初始化上的运行,它将无法正常工作。 (我曾尝试添加与其他项目相同的所有依赖项,但我没有调用它们)。

同时,class.getResource相对于当前路径,而class.getClassLoader().getResource相对于类路径的根。如果以class.getResource开头,则/可以查看类路径的根。

[为了使wsimport生成看起来在类路径的根上的代码,我使用了<wsdlLocation>/numberconversion.wsdl</location>(用/代替classpath:)。

© www.soinside.com 2019 - 2024. All rights reserved.