我正在使用wsimport
(jaxws-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>
事实证明,classpath:
方案是Spring添加的,如果没有Spring在类路径和已初始化上的运行,它将无法正常工作。 (我曾尝试添加与其他项目相同的所有依赖项,但我没有调用它们)。
同时,class.getResource
相对于当前路径,而class.getClassLoader().getResource
相对于类路径的根。如果以class.getResource
开头,则/
可以查看类路径的根。
[为了使wsimport
生成看起来在类路径的根上的代码,我使用了<wsdlLocation>/numberconversion.wsdl</location>
(用/
代替classpath:
)。