Ошибка "prefix is null" при попытке настроить клиент веб-службы
У меня есть WSDL и некоторые файлы схемы, которые я использовал для создания клиента веб-службы JAX-WS. Когда я пытаюсь получить экземпляр клиента, я получаю следующую трассировку стека:
Причина: java.lang.IllegalArgumentException: указанный префикс был нулевым. в com.ibm.xml.xlxp.api.stax.msg.StAXMessageProvider.throwIllegalArgumentException(StAXMessageProvider.java:42) в com.ibm.xml.xlxp.api.stax.XMLStreamReaderImpl.getNamespaceURI(XMLStreamReaderImpl.java:721) в com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl$XMLStreamReaderProxy.getNamespaceURI(XMLInputFactoryImpl.java:212) в com.sun.xml.internal.ws.util.xml.XMLStreamReaderFilter.getNamespaceURI(XMLStreamReaderFilter.java:242) в com.sun.xml.internal.ws.wsdl.parser.ParserUtil.getQName(ParserUtil.java:78) в com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parsePortTypeOperationInput(RuntimeWSDLParser.java:721) в com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parsePortTypeOperation(RuntimeWSDLParser.java:694) в com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parsePortType(RuntimeWSDLParser.java:668) в com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parseWSDL(RuntimeWSDLParser.java:305) в com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:136) на com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:227) на com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:190) на com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:160) в com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:92) на javax.xml.ws.Service.(Service.java:67) ...
Для меня это выглядит очень похоже на то, что класс Service пытается проанализировать WSDL как часть его инициализации, а затем завершается неудачно, потому что какой-то префикс имеет значение null. Линия at com.sun.xml.internal.ws.wsdl.parser.ParserUtil.getQName(ParserUtil.java:78)
предполагает, что у него проблемы с анализом QName. Когда служба создается, QName устанавливается следующим образом:
new QName("http://www.mycompany.ca/some/schema/MyService", "MyService")
Сообщение об ошибке не слишком ясно, хотя. Нужен ли префикс перед "MyService"
или необходимы изменения в WSDL (я не владелец WSDL, поэтому изменения трудно передать другим командам).
(среда RAD 7.5 для WAS 7.0)
1 ответ
Если вы изучите детали трассировки стека, вы заметите, что проблема связана с именем операции ввода типа порта в WSDL:
<wsdl:definitions .... >
<wsdl:portType .... >
<wsdl:operation>
<wsdl:input message="qname"/> <--- your problem is here
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>