Ошибка чтения XML: неожиданное исключение содержимого символа при вызове веб-службы - PullRequest
1 голос
/ 18 сентября 2010

Я пытаюсь вызвать публичный веб-сервис с помощью Java-клиента, но получаю следующее исключение:

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" 
  >

Я не могу понять, что я делаю неправильно. Я испытываю желание перейти к клиенту .NET {я программист на c #}, но хотел бы знать, что я делаю здесь неправильно.

Метод, вызывающий веб-сервис:

    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;

}

Ответы [ 3 ]

1 голос
/ 11 января 2011

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

call.setReturnType(XMLType.XSD_STRING);

Это помогло моему клиенту TerMine:)

1 голос
/ 16 августа 2012

изменение

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

до

Service service = serviceFactory.createService(serviceQN);

-

чтобы вы могли добавить это к своему коду ..

call.setReturnType(XMLType.XSD_STRING);
1 голос
/ 18 сентября 2010

Я подозреваю, что в вашем XML-ответе есть метка порядка байтов . См. этот SO вопрос для получения более подробной информации. Захват ответа с помощью Wireshark или аналогичного указывает на происходящее.

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

...