Реализация Spring Android Get Request: не удалось извлечь ответ: не найдено подходящего HttpMessageConverter для типа ответа и типа содержимого

Я пытаюсь реализовать запрос на получение Android Spring. Когда я запускаю приложение, я получаю следующую ошибку.

Не удалось извлечь ответ: не найдено подходящего HttpMessageConverter для типа ответа [com.example.userprofiledemo.UserProfile] и типа содержимого [text / html; charset = UTF-8]

Respose Body содержит вложенный класс и список классов, Respose xml выглядит так:

<UserProfile xmlns="http://schemas.datacontract.org/2004/07/"xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

<Address>Degisim  A Blok Asmakat</Address>
<City>Adana</City>

<UserBookingInfo>
    <ArrivalDate>2012-01-03T00:00:00</ArrivalDate>
    <CourseTypeCode>ILS</CourseTypeCode>
</UserBookingInfo>

<UserPhotoList>
  <UserPhoto> 
    <LikeCount>10</LikeCount>
    <UserPhotoId>123</UserPhotoId>
  </UserPhoto>

   <UserPhoto> 
    <LikeCount>11</LikeCount>
    <UserPhotoId>129</UserPhotoId>
  </UserPhoto>

  <UserPhoto> 
    <LikeCount>11</LikeCount>
    <UserPhotoId>129</UserPhotoId>
  </UserPhoto>
</UserPhotoList>

</UserProfile> 

Примечание: -

  1. UserProfile(Userprofile.java) - корневой класс или узел
  2. UserBookingInfo(UserBookingInfo.java) является элементом UserProfile.
  3. UserPhoteList(UserPhoteList.java) - это список UserPhotos(UserPhote.java) в UsersProfile

Это то, что я делаю для синтаксического анализа ответа с помощью Spring Android.

Мой клиент REST PopulatePojo.java

public class PopulatePojo {

public UserProfile GetUserProfile() {

    RestTemplate restTemplate = new RestTemplate(true);


    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
    FormHttpMessageConverter msgConverter = new FormHttpMessageConverter();
    messageConverters.add(new StringHttpMessageConverter());
    messageConverters.add(new SourceHttpMessageConverter());
    restTemplate.setMessageConverters(messageConverters);


    UserProfile userProfile = null;
    try {
        userProfile = restTemplate.getForObject(url, UserProfile.class);
    } catch (RestClientException e) {
        e.printStackTrace();

    }
    return userProfile;
}
}

Класс компонента UserProfile.java

@Root
public class UserProfile {

@Element(name = "Address", required = false)
private String address;

      @Element(name="City",required=false)
private String city;

      @Element(name="UserBookingInfo",required=false)
private UserBookingInfo userBookingInfo;

      @Element(name = "UserPhotoList")
private UserPhotoList userPhotoList;

      public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

      public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

      public UserBookingInfo getUserBookingInfo() {
    return userBookingInfo;
}

public void setUserBookingInfo(UserBookingInfo userBookingInfo) {
    this.userBookingInfo = userBookingInfo;
}

     public UserPhotoList getUserPhotoList() {
    return userPhotoList;
}

public void setUserPhotoList(UserPhotoList userPhotoList) {
    this.userPhotoList = userPhotoList;
}



}

Класс компонента UserBookingInfo.java

public class UserBookingInfo {

@Element(name="ArrivalDate",required=false)
private String arrivalDate;

@Element(name="CourseTypeCode",required=false)
private String courseTypeCode;

      public String getArrivalDate() {
    return arrivalDate;
}

public void setArrivalDate(String arrivalDate) {
    this.arrivalDate = arrivalDate;
}

public String getCourseTypeCode() {
    return courseTypeCode;
}

public void setCourseTypeCode(String courseTypeCode) {
    this.courseTypeCode = courseTypeCode;
}
 }

Класс компонента, который содержит список UserPhotoList (UserPhotoList.java)

@Root(name="UserPhotoList")
public class UserPhotoList {

@ElementList(inline=true,entry="UserPhoto")
private List<UserPhoto> userPhotos;

public List<UserPhoto> getUserPhotos() {
    return userPhotos;
}

public void setUserPhotos(List<UserPhoto> userPhotos) {
    this.userPhotos = userPhotos;
}

}

Класс компонента для UserPhoto.java

@Root
public class UserPhoto {

@Element(name = "LikeCount", required = false)
private String likeCount;

      @Element(name = "UserPhotoId ", required = false)
private String userPhotoId ;

      public String getLikeCount() {
    return likeCount;
}

public void setLikeCount(String likeCount) {
    this.likeCount = likeCount;
}

      public String getUserPhotoId() {
    return userPhotoId;
}

public void setUserPhotoId(String userPhotoId) {
    this.userPhotoId = userPhotoId;
}     

  }

Пожалуйста, позвольте мне, где я делаю не так. Любая помощь очень ценится.

Он отлично работает, когда я использую simpleframe и Httpget

Ниже приведен рабочий код без использования RestTemplate

новый поток (new Runnable () {

                          @Override
        public void run() {

            String xmlData = retrieve(url);
            Serializer serializer = new Persister();

            Reader reader = new StringReader(xmlData);
            try {
                UserProfile profile = serializer.read     (UserProfile.class,
                        reader, false);
            } catch (Exception e) {
                Toast.makeText(MainActivity.this, "Error Occured",
                        Toast.LENGTH_LONG).show();
                e.printStackTrace();
            }

} }).Начните();

public String retrieve (String url) {

    HttpGet getRequest = new HttpGet(url);

    try {

        HttpResponse getResponse = client.execute(getRequest);
        final int statusCode = getResponse.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) {
            return null;
        }

        HttpEntity getResponseEntity = getResponse.getEntity();

        if (getResponseEntity != null) {
            return EntityUtils.toString(getResponseEntity);
        }

    } catch (IOException e) {
        getRequest.abort();
        Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
    }

    return null;

}

Как добиться того же с помощью RestTemplete

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


person user2559548    schedule 08.07.2013    source источник


Ответы (1)


Ваш сервер возвращает содержимое XML, но сообщает, что он возвращает содержимое HTML (тип содержимого text/html в соответствии с сообщением об ошибке), и, следовательно, синтаксический анализ не удался. Вам нужно убедиться, что ваш сервер возвращает что-то вроде text/xml, а также что у вас есть правильные преобразователи в вашем объекте шаблона отдыха.

Изменить: попробуйте добавить этот конвертер сообщений. Ставьте первым (перед StringHttpMessageConverter и SourceHttpMessageConverter)

Jaxb2RootElementHttpMessageConverter jaxbMessageConverter = new Jaxb2RootElementHttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.TEXT_HTML);
jaxbMessageConverter.setSupportedMediaTypes(mediaTypes);
messageConverters .add(jaxbMessageConverter);
person Avi    schedule 09.07.2013
comment
Хорошее наблюдение, спасибо за обратную связь. Я не контролирую, какой сервер возвращает. Не могли бы вы предложить мне какие-либо работы на стороне клиента. Я могу получить (проанализировать) то же самое, используя simpleFramework и через Httpget, но у меня эта проблема возникает только с помощью RestTemplate. Я обновляю свой вопрос рабочим кодом, который использует simpleFramework, но не RestTemplate. - person user2559548; 10.07.2013
comment
Что произойдет, если вы вызовете URL-адрес через браузер? - person Avi; 10.07.2013
comment
Спасибо за ваши последующие действия и предложение, я добавил ваш код, который приводит к ошибке class not found (Jaxb2RootElementHttpMessageConverter.class). Я добавил конкретную банку для исправления, это привело меня к другой проблеме. Но ваше первое предложение было правильным, это проблема с серверной частью, наконец, серверные ребята исправили эту проблему после обсуждения с ними, теперь все работает нормально без каких-либо изменений с моей стороны. Я хотел бы попробовать альтернативное решение, которое вы упомянули в своем ИЗМЕНИТЬ когда-нибудь (еще раз). Еще раз спасибо. - person user2559548; 11.07.2013