当我尝试使用rest Template和SimpleXmlHttpMessageConverter检索xml时出现此错误,我不知道为什么
04-09 12:02:00.920:W / System.err(16431):org.springframework.http.converter.HttpMessageNotReadableException:无法读取[class com.intescia.library.donnee.dto.wsresponse.MenuDto] ;嵌套异常是org.xmlpull.v1.XmlPullParserException:意外的标记(位置:java.io.InputStreamReader@21244c40中的TEXT @ 1:2)
这是我的代码:
private RestTemplate getRestTemplateInstance() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
restTemplate.getMessageConverters().add(new SimpleXmlHttpMessageConverter());
return restTemplate;
}
private HttpHeaders getHeader(Context context) {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Collections.singletonList(MediaType.ALL));
requestHeaders.setAcceptEncoding(ContentCodingType.ALL);
return requestHeaders;
}
@Override
public MenuDto RecupererMenu(Context context,String url) {
HttpHeaders requestHeaders = getHeader(context);
RestTemplate restTemplate = getRestTemplateInstance();
try {
ResponseEntity<MenuDto> responses = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<String>(requestHeaders),MenuDto.class);
if(statusIsNotModified(responses.getStatusCode()))
return null;
MenuDto menu= responses.getBody();
return menu;
} catch (Exception e) {
e.printStackTrace();
Log.i(TAG+" message="+e.getMessage(), "PROBLEM CONNEXION OU MAUVAISE URL? ERROR PAS DE REPONSE A PARTIR DE L URL= "+url);
return null;
}
}
当我尝试使用String时,它可以正常工作
public MenuDto RecupererMenu(Context context,String url) {
HttpHeaders requestHeaders = getHeader(context);
RestTemplate restTemplate = getRestTemplateInstance();
String responseString="";
try {
ResponseEntity<String> responses = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<String>(requestHeaders),String.class);
responseString= responses.getBody();
Serializer serializer = new Persister();
MenuDto menu = serializer.read(MenuDto.class, responseString);
return menu;
} catch (Exception e) {
e.printStackTrace();
Log.i(TAG+" message="+e.getMessage(), "PROBLEM CONNEXION OU MAUVAISE URL? ERROR PAS DE REPONSE A PARTIR DE L URL= "+url);
return null;
}
}
文件xml是这样的:
<menu>
<menu_item gabarit="a_la_une">
<label>A la Une</label>
<url>
http://coiffuredeparis-recette.intescia.com/applis/a_la_une.aspx
</url>
</menu_item>
<menu_item gabarit="groupe">
<label>Profession coiffeur</label>
<menu>
<menu_item gabarit="rubrique">
<label>Marché</label>
<id>25</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/marche
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Organisation et management</label>
<id>30</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Organisation-et-management
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Stratégies d'entreprise</label>
<id>31</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Strategies-dentreprise
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Equipement et design</label>
<id>32</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Equipement-et-design
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Bien être</label>
<id>33</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Bien-etre
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Ecoles</label>
<id>572</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Ecoles/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>Style et Savoir faire</label>
<menu>
<menu_item gabarit="rubrique">
<label>L'invité du mois</label>
<id>44</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Linvite-du-mois/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Tendances</label>
<id>41</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Tendances/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Savoir-faire</label>
<id>42</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Savoir-faire/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Le point sur...</label>
<id>43</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Le-point-sur/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Fiches techniques</label>
<id>29</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Fiches-techniques/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Formations artistiques</label>
<id>45</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Formations-artistiques/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>La rédac a repéré</label>
<menu>
<menu_item gabarit="rubrique">
<label>Salons insolites</label>
<id>46</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Salons-insolites/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Shopping produits</label>
<id>47</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Shopping-produits/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Banc d'essai</label>
<id>48</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Banc-dessai/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Accessoires</label>
<id>49</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Accessoires/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>Culture Coiffure</label>
<menu>
<menu_item gabarit="rubrique">
<label>Les irrésistibles</label>
<id>50</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Les-irresistibles/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Le saviez-vous ?</label>
<id>51</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Le-saviez-vous/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Couturiers du cheveu</label>
<id>52</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Couturiers-du-cheveu/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>Evènements</label>
<menu>
<menu_item gabarit="rubrique">
<label>Vidéos</label>
<url>
http://www.coiffuredeparis.fr/applis/rubrique_videos.xml
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>Services</label>
<menu>
<menu_item gabarit="rubrique" ref="agenda">
>
<label>Agenda</label>
<id>229</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Agenda/
</url>
</menu_item>
<menu_item gabarit="emplois">
<label>Offres d'emploi</label>
<url>http://www.coiffuredeparis.fr/applis/emploi.aspx</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Fond de Commerce et Vente de matériel</label>
<url>
http://www.coiffuredeparis.fr/applis/fond_de_commerce.aspx
</url>
</menu_item>
<menu_item gabarit="webview">
<label>Prochain Business Trophy</label>
<url>
http://www.coiffuredeparis.fr/Evenements/Business-Trophy/2014/2/Business-Trophy-2014/
</url>
</menu_item>
<menu_item gabarit="webview">
<label>Dernier Business Trophy</label>
<url>
http://www.coiffuredeparis.fr/Evenements/Business-Trophy/2014/3/Retour-sur-les-laureats-2013-2019615W/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>MON COMPTE</label>
<menu>
<menu_item gabarit="compte">
<label>Se déconnecter</label>
</menu_item>
<menu_item gabarit="abonnement">
<label>Mon abonnement</label>
</menu_item>
<menu_item gabarit="favoris">
<label>Mes Favoris</label>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="parametres">
<label>Paramètres</label>
</menu_item>
<menu_item gabarit="avis">
<label>Donner un avis sur l'application</label>
</menu_item>
<menu_item gabarit="autopromo">
<label>Autopromo</label>
</menu_item>
</menu>
类MenuDto.java是:
@Root(name="menu",strict=false)
public class MenuDto {
public List<MenuItemDto> getListMenuItem() {
return listMenuItem;
}
public void setListMenuItem(List<MenuItemDto> listMenuItem) {
this.listMenuItem = listMenuItem;
}
public MenuDto(){
super();
}
@ElementList(entry="menu_item",inline=true)
private List <MenuItemDto> listMenuItem ;
}
MenuItemDto.java:
@Root(name="menu_item",strict=false)
公共类MenuItemDto {
public String getGabarit() {
return gabarit;
}
public void setGabarit(String gabarit) {
this.gabarit = gabarit;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public MenuDto getMenu() {
return menu;
}
public void setMenu(MenuDto menu) {
this.menu = menu;
}
public MenuItemDto(){
super();
}
@Attribute
private String gabarit;
@Element
private String label;
@Element(required=false)
private String url;
@Element(required=false)
private String smartAdPageId;
public String getSmartAdPageId() {
return smartAdPageId;
}
public void setSmartAdPageId(String smartAdPageId) {
this.smartAdPageId = smartAdPageId;
}
public MenuItemDto(String label) {
super();
this.label = label;
}
@Element(name="id",required=false)
private String Rubriqueid;
@Element(required=false)
private MenuDto menu;
public String getRubriqueid() {
return Rubriqueid;
}
public void setRubriqueid(String rubriqueid) {
Rubriqueid = rubriqueid;
}
}
感谢您的回复
答案 0 :(得分:0)
有同样的问题:
解决了这个问题:
请参阅此链接:Reading UTF-8 - BOM marker
//InputStreamReader isr = new InputStreamReader(body.in(), charset);
InputStreamReader isr = new InputStreamReader(new BOMInputStream(body.in(), false, ByteOrderMark.UTF_8));
SimpleXmlConverter类中的Overriden(Retrofit和SimpleXMLConverter)