2010-09-18 2 views
1

Am пытается вызвать общественный WebService с помощью клиента Java, но я получаю следующее исключение:XML: неожиданное содержание символов исключение при вызове вебсервис

deserialization error: XML reader error: unexpected character content: "<?xml version="1.0" ?> 
<rankedTermCandidates 
    xmlns="http://www.nactem.ac.uk/xsd/termine" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.nactem.ac.uk/xsd/termine http://www.nactem.ac.uk/software/termine/webservice/termine.xsd" 
    > 

Am не в состоянии выяснить, что я делать неправильно. У меня возникает желание перейти на .NET-клиент {am a C# programmer}, но мне хотелось бы знать, что я делаю неправильно здесь.

Способ вызова веб-сервиса является:

private String InvokeNactemWebService(String textToParse) throws Exception 
{ 

String wsdlURL = "http://www.nactem.ac.uk/software/termine/webservice/termine.wsdl"; 
URL url = new URL(wsdlURL); 
String targetNamespace = "urn:termine"; 
String serviceName = "termine"; 
String  portName = "termine_porttype"; 
String operationName = "analyze"; 
QName serviceQN = new QName(targetNamespace, serviceName); 
QName  portQN = new QName(targetNamespace, portName); 
QName operationQN = new QName(targetNamespace, operationName); 

String parseResult = ""; 

try 
{ 
     ServiceFactory serviceFactory = ServiceFactory.newInstance(); 
     Service service = serviceFactory.createService(url, serviceQN); 

     Call call = (Call) service.createCall(); 
     call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, ""); 
     call.setProperty(Call.OPERATION_STYLE_PROPERTY, "rpc"); 
     call.setTargetEndpointAddress("http://www.nactem.ac.uk:9000/termine"); 


     call.setPortTypeName(portQN); 
     call.setOperationName(operationQN); 

     call.removeAllParameters(); 
     call.addParameter("src",   XMLType.XSD_STRING, ParameterMode.IN); 
     call.addParameter("input_format", XMLType.XSD_STRING, ParameterMode.IN); 
     call.addParameter("output_format", XMLType.XSD_STRING, ParameterMode.IN); 
     call.addParameter("stoplist",  XMLType.XSD_STRING, ParameterMode.IN); 
     call.addParameter("filter",  XMLType.XSD_STRING, ParameterMode.IN); 


     Object[] inParams = new Object[] {textToParse, "", "xml", "", ""}; 

     Object result = call.invoke(inParams); 
     //parseResult = (String) call.invoke(inParams); 
     //System.out.println(call.invoke(inParams)); 
     return parseResult; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     Debug.println(e.getMessage(), e.getStackTrace().toString()); 
    } 

    return parseResult; 

} 

ответ

1

Я подозреваю, что есть в вашем ответе XML byte-order-mark. См. this SO question для получения дополнительной информации. Захват ответа с использованием Wireshark или аналогичного будет означать, что происходит.

Если у вас есть спецификация, я подозреваю, что вы можете установить фильтр сервлета, чтобы перехватить ответ до анализа XML-синтаксиса webservice и удалить спецификацию из необработанного ответа, прежде чем передавать его вперед.

+0

Благодаря Brian! Правильно. Ниже приведено исключение stacktrace: Но я не могу найти способ удаления спецификации из ответа. В частности, я хотел бы сделать следующее: (call.invoke (inParams)). RemveBOM(); Есть ли быстрый способ сделать это на Java? Ссылка, о которой вы указали, показывает обходной путь для клиента .NET. – Codex

+0

См. Мой исправленный ответ. –

+0

Это имеет смысл! Попробуем. Благодарю. – Codex

1

я мог бы быть немного поздно, но я считаю, все, что вам нужно сделать, это установить тип возвращаемого значения, что вы будете ожидать, как:

call.setReturnType(XMLType.XSD_STRING); 

Это сделал трюк для моего Termine клиента :)

1

изменение

Service service = serviceFactory.createService(url, serviceQN); 

в

Service service = serviceFactory.createService(serviceQN); 

-

, так что вы можете добавить это в ваш код ..

call.setReturnType(XMLType.XSD_STRING); 
Смежные вопросы