2015-10-25 4 views
6

हमारे पास एक बाहरी वेब-सेवा के लिए बाध्यकारी एक जेएक्स-डब्ल्यूएस/जेएक्सबी है जो जावा 7 पर ठीक काम कर रहा है (1.7.0u80) शामिल संदर्भ कार्यान्वयन के साथ। जावा 8 (1.8.0u66) पर माइग्रेशन के दौरान वेब सेवा कॉल आम तौर पर ठीक काम करते हैं, हालांकि यह एसएएपी दोषों और उनके विस्तार तत्वों को जावा अपवादों को अब कस्टम विवरण के साथ अनारश नहीं कर सकता है, इसके बजाय उपसर्ग एक नामस्थान त्रुटि से बंधे नहीं है।"उपसर्ग xsd किसी नामस्थान से बाध्य नहीं है" जावा पर माइग्रेशन के बाद जेएक्सबी के साथ गैर-मार्शलिंग SOAPFault 8

विफलता

Caused by: javax.xml.ws.WebServiceException: java.lang.IllegalArgumentException: prefix xsd is not bound to a namespace 
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:138) 
at com.sun.xml.internal.ws.client.sei.StubHandler.readResponse(StubHandler.java:238) 
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:189) 
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:276) 
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:104) 
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77) 
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147) 
at com.sun.proxy.$Proxy61.proprietaryServiceCall(Unknown Source) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:580) 
at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:554) 
... 56 more 
Caused by: java.lang.IllegalArgumentException: prefix xsd is not bound to a namespace 
at com.sun.xml.internal.bind.DatatypeConverterImpl._parseQName(DatatypeConverterImpl.java:355) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.LeafPropertyXsiLoader.selectLoader(LeafPropertyXsiLoader.java:75) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.LeafPropertyXsiLoader.startElement(LeafPropertyXsiLoader.java:58) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:559) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:60) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) 
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:229) 
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:266) 
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:235) 
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:112) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:354) 
at com.sun.xml.internal.bind.v2.runtime.BridgeImpl.unmarshal(BridgeImpl.java:124) 
at com.sun.xml.internal.bind.api.Bridge.unmarshal(Bridge.java:309) 
at com.sun.xml.internal.ws.db.glassfish.BridgeWrapper.unmarshal(BridgeWrapper.java:217) 
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.getJAXBObject(SOAPFaultBuilder.java:304) 
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:135) 

बाह्य सेवा से प्रतिक्रिया की तरह लग रहा है नीचे (मैं प्रकार के नाम अनाम रखी जाती है, लेकिन सब कुछ छोड़ दिया है)

<env:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <env:Header/> 
     <env:Body> 
     <env:Fault> 
      <faultcode>env:Server</faultcode> 
      <faultstring>ERROR MESSAGE</faultstring> 
      <detail> 
       <n1:ProprietaryException xmlns:n1="java:com.company.service" xsi:type="n1:ProprietaryException"> 
        <errorCode xsi:type="xsd:int">400</errorCode> 
        <errorReason xsi:type="xsd:string">Specific error</errorReason> 
       </n1:ProprietaryException> 
      </detail> 
     </env:Fault> 
    </env:Body> 
</env:Envelope> 

समस्या XSD के साथ है : int और xsd: stringCode और faultReason में स्ट्रिंग। ऐसा लगता है कि बाध्यकारी होने पर उपसर्ग/नामस्थान घोषणा शीर्ष स्तर के लिफाफे से विरासत में नहीं मिल रही है। समस्या this question के समान दिखती है, सिवाय इसके कि यह एसओएपी फॉल्ट हैंडलिंग के बारे में है, और मेरे मामले में, कोड जेएक्स-डब्ल्यूएस और जेएक्सबी के अंदर गहरा है, इसलिए मुझे नहीं पता कि हम इसे कैसे ठीक कर सकते हैं या इसे हल कर सकते हैं।

जब तक पुराना कोड कुछ व्यवहारों पर भरोसा नहीं कर रहा था, जो कभी काम नहीं करना चाहिए था, तो मैं मदद नहीं कर सकता लेकिन निष्कर्ष निकाला कि जावा 8 कार्यान्वयन में जेएक्स-डब्ल्यूएस और जेएक्सबी के बीच कुछ तोड़ दिया गया है।

अपडेट (जनवरी 4 2016): मैंने मेट्रो आरआई के बजाय सीएक्सएफ 3.1.4 क्लाइंट के साथ भी कोशिश की है। एक ही समस्या है। यह के रूप में उल्लेख here

अद्यतन (जनवरी 6 2016) एक ही मुद्दा हो रहा है: मैं एक परिवर्तन JAXB आरआई 2.2.6 के लिए पेश करने के लिए इस समस्या को संकुचित कर दिया है। इस प्रकार समस्या को जावा 7 पर जेएक्सबी आरआई 2.2.6 के लिए मजबूर अपग्रेड के साथ दोहराया जा सकता है। ऐसा लगता है कि यह JAXB-890 में किए गए परिवर्तनों से संबंधित हो सकता है।

मैं कम से कम दो अलग अलग तरीकों से इस के आसपास काम कर परीक्षण किया है:

  1. उपयोग JAXB बल के साथ जावा 8 2.2.5 के लिए वापस डाउनग्रेड (JAX-WS संस्करण में कोई फर्क नहीं लगता है)। एक अच्छा दीर्घकालिक समाधान प्रतीत नहीं होता है।
  2. मैंने पाया कि -Dcom.sun.xml.bind.improvedXsiTypeHandling=false (या बंडल जेडीके जेएक्सबी आरआई का उपयोग करते हुए समकक्ष .internal संपत्ति) इस मुद्दे को हल करने के लिए प्रतीत होता है। लेकिन मुझे नहीं पता कि यह सेटिंग वास्तव में क्या करती है; या मेरे सिस्टम में शेष JAXB उपयोग के लिए क्या प्रभाव होंगे।

यहां आगे बढ़ने के लिए कोई विचार? (1.6.2 परीक्षण किया

+1

क्या आप 'xmlns: xsd =' घोषणा 'लिफाफा' से 'Fault' तत्व में ले जा सकते हैं? – Holger

+0

दुर्भाग्य से, बिना किसी पूर्व-अनमशेल एक्सएमएल हैक के, जैसा कि मैं जिस सेवा को बुला रहा हूं वह मेरा नहीं है। मुझे विश्वास नहीं है कि उनकी प्रतिक्रिया में कुछ भी गलत है, हालांकि मैं मानता हूं कि शायद इस मुद्दे को हल करेंगे। – Chad

उत्तर

1

एक वैकल्पिक हल जो काम करने के लिए लगता है (लेकिन आवश्यक नहीं किया जाना चाहिए और अपने आवेदन के अन्य भागों जो यह अवांछनीय बनाने में JAXB उपयोग के लिए अन्य परिणाम है) EclipseLink MOXY साथ JAXB प्रदाता को बदलने के लिए है)।

इस काम को देखते हुए, ऐसा लगता है कि यह जावा 8 (कम से कम 1.8.0u66 तक) के साथ जेएक्सबी आरआई (मेट्रो) संस्करण में एक समस्या है।

0

हाल ही में इसी तरह की एक समस्या का सामना करना पड़ा।MOXY पर स्विच करना या कुछ अस्पष्ट JVM पैरामीटर का उपयोग करना एक विकल्प नहीं था, इसलिए मैंने ऊपर वर्णित "प्री-अनमारश हैक" के किसी प्रकार को लागू करने के तरीकों को देखा।

बाहर कर देता है, यदि आप ऐसा

public class NamespaceBindingShim implements SOAPHandler<SOAPMessageContext> { 

    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
    return true; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) { 
    context.getMessage();  
    return true; 
    } 

    @Override 
    public void close(MessageContext context) { 
    } 

    @Override 
    public Set<QName> getHeaders() { 
    return null; 
    } 
} 

और उसके बाद की तरह एक SOAPHandler की तरह अपने ग्राहक की हैंडलर श्रृंखला में जोड़ने बनाने इसलिए

ServicePort port = service.getServicePort(); 
BindingProvider bindingProvider = (BindingProvider) port; 
Binding binding = bindingProvider.getBinding(); 
binding.setHandlerChain(Collections.singletonList(new NamespaceBindingShim())); 

तो सब कुछ चमत्कारिक ढंग से काम करता है और मालिकाना सोप दोष मिल मालिकाना अपवादों में परिवर्तित।

मुझे अभी तक पता नहीं है कि यह क्यों काम करता है और यह कुछ और तोड़ता है, क्योंकि यह स्पष्ट है कि मैं हैंडलर के अंदर कोई एक्सएमएल मैनिपुलेशन नहीं करता हूं (गेटटर केवल लिफाफा AFAICT के लिए आलसी डॉम प्रारंभिकता को आमंत्रित करता है)।

संपादित करें: अधिक परीक्षण के बाद मैंने कुछ परीक्षणों में पारित होने के लिए यह खोज लिया है, लेकिन दूसरों में विफल होने के लिए। ड्राइंग बोर्ड पर वापस ...

संबंधित मुद्दे