Ok, it looks like you can override the WSDL in the constructor of the
autogenerated service object, like:
String wsdlUrl =
"https://somehost:someport/path/to/the/wsdl/MyService.wsdl";
MyService service = new MyService(new URL(wsdlUrl));
However, that let me to a new problem:
junit.framework.AssertionFailedError: error:
javax.xml.ws.WebServiceException:
org.apache.cxf.service.factory.ServiceConstructionException: Failed to
create service.
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:134)
at
org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:65)
at javax.xml.ws.Service.<init>(Service.java:56)
at ... (autogenerated client code)
at ...
Caused by: org.apache.cxf.service.factory.ServiceConstructionException:
Failed to create service.
at
org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:83)
at
org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:140)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:132)
... 31 more
Caused by: javax.wsdl.WSDLException: WSDLException:
faultCode=PARSER_ERROR: Problem parsing
'https://somehost:someport/path/to/the/wsdl/MyService.wsdl'.:
java.io.IOException: HTTPS hostname wrong: should be <somehost:someport>
at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(Unknown Source)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(Unknown Source)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(Unknown Source)
at
org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:206)
at
org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:170)
at
org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:81)
... 33 more
Caused by: java.io.IOException: HTTPS hostname wrong: should be
<somehost:someport>
at
sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(HttpsClient.java:490)
at
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:415)
at
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:934)
at
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at
com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:973)
at
com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:184)
at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:798)
at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at
com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
at
com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:250)
at
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292)
...
This error occurs when the wsdl URL's hostname does not match the Common
Name (CN) on the server certificate.
I'm already doing the following which combatted the issue previously
when I was using a local WSDL file and wasn't having to use HTTPS to get
access to it:
Client client = ClientProxy.getClient(portType);
HTTPConduit conduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
TLSClientParameters params = conduit.getTlsClientParameters();
if (params == null) {
params = new TLSClientParameters();
conduit.setTlsClientParameters(params);
}
// NOTE! ONLY DO THIS FOR TESTING, NOT PRODUCTION!
// this is to get around the error:
// The https URL hostname does not match the Common Name (CN) on
the server certificate. To disable this check (NOT recommended for
production) set the CXF client TLS configuration property
"disableCNCheck" to true.
params.setDisableCNCheck(true);
However, now that I'm accessing the WSDL via HTTPS, it would appear that
there should be some mechanism to allow me to tell the client to not
crap out (disable the CN check) for the get WSDL over HTTPS check in
addition to the actual service usage call.
Unfortunately I'm at a loss for how to do that.
Thanks in advance for any help you can provide,
Gary
Gary Weaver wrote:
Hello again,
Anyone know why the client code generated by cxf-codegen-plugin v2.1 +
JAXB is hardcoding the original WSDL file's path into the client
classes, and then looking for that file when the client is used?
Any idea how to keep it from doing that?
For example, in one of the autogenerated client service classes it has
a static block that looks like:
...
static {
URL url = null;
try {
url = new
URL("file:/path/to/my/project/trunk/src/main/wsdl/MyService.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl
from file:/path/to/my/project/trunk/src/main/wsdl/MyService.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
...
And in the pom.xml looks like:
...
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>checklist</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/wsdl/MyService.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
...
</executions>
</plugin>
...
And the error that occurs when you run this in an environment where
that path/file
(/path/to/my/project/trunk/src/main/wsdl/MyService.wsdl) doesn't exist
is:
javax.xml.ws.WebServiceException:
org.apache.cxf.service.factory.ServiceConstructionException: Failed to
create service.
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:134)
at
org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:65)
at javax.xml.ws.Service.<init>(Service.java:56)
at ... (autogenerated client code)
at ...
Caused by:
org.apache.cxf.service.factory.ServiceConstructionException: Failed to
create service.
at
org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:83)
at
org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:140)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:132)
...
Caused by: javax.wsdl.WSDLException: WSDLException:
faultCode=PARSER_ERROR: Problem parsing
'file:/path/to/my/project/trunk/src/main/wsdl/MyService.wsdl'.:
java.io.FileNotFoundException:
/path/to/my/project/trunk/src/main/wsdl/MyService.wsdl (No such file
or directory)
at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(Unknown Source)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(Unknown Source)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(Unknown Source)
at
org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:206)
at
org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:170)
at
org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:81)
...
Caused by: java.io.FileNotFoundException:
/path/to/my/wsdl/MyService.wsdl (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at
sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
at
sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
at
org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown
Source)
at
org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown
Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown
Source)
...
Thanks in advance!
Gary
--
Gary Weaver
Internet Framework Services
Office of Information Technology
Duke University