През последните 48 часа си блъсках главата с този абсолютно вбесяващ бъг, така че реших най-накрая да хвърля кърпата и да опитам да попитам тук, преди да хвърля лаптопа си през прозореца.
Опитвам се да анализирам XML отговора от извикване, което направих към AWS SimpleDB. Отговорът се връща по жицата съвсем добре; например може да изглежда така:
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
Предавам този XML на анализатор с
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
и се обаждам на eventReader.nextEvent();
няколко пъти, за да получа данните, които искам.
Ето странната част - работи чудесно в локалния сървър. Отговорът идва, анализирам го, всички са доволни. Проблемът е, че когато разположа кода в Google App Engine, изходящата заявка все още работи и отговорът XML изглежда 100% идентичен и правилен за мен, но отговорът не успява да анализира със следното изключение:
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines omitted)
Проверих двойно, тройно, четворно този XML за „невидими знаци“ или не-UTF8 кодирани знаци и т.н. Разгледах го байт по байт в масив за маркировки за ред на байтове или нещо от този род. Нищо; преминава всеки валидиращ тест, който мога да му подложа. Още по-странно, това се случва, ако използвам и базиран на Saxon анализатор -- но САМО на GAE, той винаги работи добре в моята локална среда.
Това прави много трудно проследяването на кода за проблеми, когато мога да стартирам дебъгера само в среда, която работи перфектно (не намерих никакъв добър начин за отдалечено отстраняване на грешки на GAE). Въпреки това, използвайки примитивните средства, които имам, опитах милиони подходи, включително:
- XML със и без пролога
- Със и без нови редове
- Със и без атрибута "encoding=" в пролога
- И двата стила за нов ред
- Със и без информацията за разкъсване, присъстваща в HTTP потока
И пробвах повечето от тях в множество комбинации, където имаше смисъл да си взаимодействат -- нищо! Аз съм на края на акъла си. Някой виждал ли е подобен проблем преди, който да се надяваме да хвърли малко светлина върху него?
Благодаря!