I have a JaxWS web service client that has been running Java 6 for many years. Now that Java has been upgraded to version 8, we get a NullPointerException when receiving the port
java.lang.NullPointerException at com.sun.xml.internal.ws.client.ClientContainer$1.getResource(Unknown Source) at com.sun.xml.internal.ws.assembler.MetroConfigLoader.locateResource(Unknown Source) at com.sun.xml.internal.ws.assembler.MetroConfigLoader.locateResource(Unknown Source) at com.sun.xml.internal.ws.assembler.MetroConfigLoader.init(Unknown Source) at com.sun.xml.internal.ws.assembler.MetroConfigLoader.<init>(Unknown Source) at com.sun.xml.internal.ws.assembler.TubelineAssemblyController.getTubeCreators(Unknown Source) at com.sun.xml.internal.ws.assembler.MetroTubelineAssembler.createClient(Unknown Source) at com.sun.xml.internal.ws.client.Stub.createPipeline(Unknown Source) at com.sun.xml.internal.ws.client.Stub.<init>(Unknown Source) at com.sun.xml.internal.ws.client.Stub.<init>(Unknown Source) at com.sun.xml.internal.ws.client.Stub.<init>(Unknown Source) at com.sun.xml.internal.ws.client.sei.SEIStub.<init>(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.getStubHandler(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(Unknown Source) at javax.xml.ws.Service.getPort(Unknown Source) at myclient.stub.MyService.<init>(MyService.java:38)
I tried to launch it using Java 7 version 1.7.0_80, and there it also works, but the very first version of Java 8 throws this exception.
I’ve been banging my head on this for several minutes, so if someone can give me some tips on where to start fixing this, it will be really great.
Here's the WSDL, I edited it a bit, as this is not my service, but hopefully this is enough?
<?xml version="1.0" encoding="utf-8" standalone="no"?> <wsdl:definitions xmlns:ns1="http://www.dummyservice/sample/interface" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Sample" targetNamespace="http://www.dummyservice/sample/interface"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" targetNamespace="http://www.dummyservice/sample/interface" xmlns="http://www.dummyservice/sample/interface" elementFormDefault="qualified" jaxb:version="2.0"> <xs:element name="PersonQuery"> <xs:complexType> <xs:sequence> <xs:element name="system" type="xs:string" /> <xs:element name="user" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="PersonReply"> <xs:complexType> <xs:sequence> <xs:element name="Header" type="HeaderType" /> <xs:element name="person" type="PersonType" minOccurs="0" maxOccurs="1" /> <xs:element name="address" type="AddressType" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="HeaderType"> <xs:sequence> <xs:element name="tila" type="StatusType" /> </xs:sequence> </xs:complexType> <xs:simpleType name="StatusType"> <xs:annotation> <xs:appinfo> <jaxb:typesafeEnumClass> <jaxb:typesafeEnumMember name="SUCCESS" value="0001" /> <jaxb:typesafeEnumMember name="FAIL" value="0000" /> </jaxb:typesafeEnumClass> </xs:appinfo> </xs:annotation> <xs:restriction base="xs:string"> <xs:enumeration value="0000" /> <xs:enumeration value="0001" /> </xs:restriction> </xs:simpleType> <xs:complexType name="PersonType"> <xs:sequence> <xs:element name="firstname" type="xs:string" minOccurs="0" /> <xs:element name="lastname" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> <xs:complexType name="AddressType"> <xs:sequence> <xs:element name="addresstype" type="AddresstypeType" minOccurs="0" /> <xs:element name="streetaddress" type="xs:string" minOccurs="0" /> <xs:element name="city" type="xs:string" minOccurs="0" /> <xs:element name="postalcode" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> <xs:simpleType name="AddresstypeType"> <xs:annotation> <xs:appinfo> <jaxb:typesafeEnumClass> <jaxb:typesafeEnumMember name="HOME" value="001" /> <jaxb:typesafeEnumMember name="OFFICE" value="002" /> </jaxb:typesafeEnumClass> </xs:appinfo> </xs:annotation> <xs:restriction base="xs:string"> <xs:enumeration value="001" /> <xs:enumeration value="002" /> </xs:restriction> </xs:simpleType> </xs:schema> </wsdl:types> <wsdl:message name="PersonQueryOperationRequest"> <wsdl:part element="ns1:PersonQuery" name="parameters" /> </wsdl:message> <wsdl:message name="PersonQueryOperationResponse"> <wsdl:part element="ns1:PersonReply" name="parameters" /> </wsdl:message> <wsdl:portType name="SamplePort"> <wsdl:operation name="PersonQueryOperation"> <wsdl:input message="ns1:PersonQueryOperationRequest" /> <wsdl:output message="ns1:PersonQueryOperationResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="SampleSOAP" type="ns1:SamplePort"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="PersonQueryOperation"> <soap:operation soapAction="http://www.dummyservice/sample/interface/SampleOperation" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="SampleService"> <wsdl:port binding="ns1:SampleSOAP" name="Sample"> <soap:address location="https://127.0.0.1/data/ws" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
Editing. It seems that the problem with loading classes is a problem, and the class loader of the class classes and the class loader of the classes are null in this ClientContainer.
private final ResourceLoader loader = new ResourceLoader() { public URL More ...getResource(String resource) throws MalformedURLException { ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl == null) { cl = this.getClass().getClassLoader(); } return cl.getResource("META-INF/"+resource); } };
When we explicitly install the system class loader in the context class loader before calling ws call, it started working. But is it good for this? I am wondering why this stopped working in Java8, and could this be a problem in their ws implementation?
Hello,
Janne
source share