Tôi có máy khách dịch vụ web JaxWS đã chạy thành công trong Java 6 trong nhiều năm. Bây giờ khi Java được nâng cấp lên phiên bản 8, chúng tôi đang nhận được NullPointerException khi nhận cổngMáy khách webservice của JaxWS cho Java 6 không hoạt động trong Java 8
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)
Tôi đã thử chạy nó với Java 7 phiên bản 1.7.0_80 và ở đó nó cũng làm việc nhưng phiên bản đầu tiên của Java 8 nguyên nhân này ngoại lệ.
Tôi đã đập đầu của tôi với điều này một thời gian khá bây giờ vì vậy nếu ai đó có thể cho tôi bất kỳ manh mối nơi để bắt đầu sửa chữa này nó sẽ thực sự tuyệt vời.
Đây là WSDL, tôi đã chỉnh sửa nó một chút vì đó không phải là dịch vụ của tôi nhưng hy vọng là đủ?
<?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>
Chỉnh sửa: Tải lớp có vẻ là vấn đề, cả trình nạp lớp ngữ cảnh và trình nạp lớp lớp đều rỗng trong 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);
}
};
Khi chúng tôi đặt rõ ràng trình nạp lớp hệ thống vào trình nạp lớp ngữ cảnh trước khi gọi ws gọi nó bắt đầu hoạt động. Nhưng đó là sửa chữa tốt cho điều này? Tôi tự hỏi tại sao điều này đã ngừng làm việc trong Java8 và điều này có thể là một vấn đề trong việc thực hiện ws của họ?
Kính trọng,
Janne
Bạn có thể chỉnh sửa câu hỏi của mình để bao gồm WSDL, vì vậy chúng tôi có thể cố gắng tạo lại vấn đề không? – VGR
Tôi đã bao gồm WSDL, tôi đã phải chỉnh sửa nó để phân biệt nó với bản gốc nhưng hy vọng rằng đó là ok. –
Dường như cách duy nhất [phương thức đó] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/com/sun/xml/nội bộ/ws/client/ClientContainer.java # ClientContainer.0loader) có thể ném NullPointerException là khi lớp được nạp bởi hệ thống ClassLoader (vì [ Java được phép trả về null để chỉ ra hệ thống ClassLoader (http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getClassLoader--)). Bạn đang chạy hệ điều hành nào? Bạn đã thử sử dụng phiên bản Java mới nhất chưa? – VGR