2011-10-24 7 views
1

У меня есть проект Spring MVC 3/J2EE. Контроллеры рендеринга jsp работают нормально, но один контроллер, который отображает XML для Ajax, не работает. Я использую JDK 1.6 в RAD 7.5, поэтому JAXB должен быть на пути к классам, и я даже попытался добавить последние JAXB-банки в файл lib, чтобы убедиться. Я все еще получаю ошибку 406, когда я делаю звонок. Мой вызов DOJO имеет handleAs: "xml", и я подтвердил, что application/xml находится на заголовке Accept через FireBug. У меня есть строка <mvc:annotation-driven /> в моем XML-файле весеннего сервлета. Я вижу, что метод вызывается и возвращается без ошибок. Я не уверен, что я должен попробовать после отладки.@ResponseBody не создает XML в Java 6

//Country is a class with only primative types which implements Serializable. 
public @ResponseBody List<Country> getCountries(){ 
    return addressService.getCountries(); 
} 

function loadData(){ 
    console.log("Before get ..."); 
    dojo.xhrGet({ 
     url:"http://localhost:9080/sample/shared/getCountries.htm", 
     handleAs:"xml", 
     load: function(data){ 
      console.log("In load function ..."); 
      try { 
       for(var i in data){ 
        console.log("key", i, "value", data[i]); 
       } 
      }catch (ex){ 
       console.error("Failure in load function: " + ex); 
      } 
      console.log("Exiting load function ..."); 
     }, 
     error: function(x){ 
      console.error("Error in ajax ..."); 
      console.error(x); 
     }, 
     failOk: false 
    }); 
    console.log("After get ..."); 
} 

ответ

4

Попробуйте создать следующий класс обертку:

@XmlRootElement 
class Countries { 
    private List<Country> countries = new ArrayList<Country>() 

    //getters/setters 
} 

И вернуть его из контроллера вместо исходного списка:

public @ResponseBody Countries getCountries() 

Скорее всего ваша проблема вызвана JAXB, который не может мобилизовывать Список Java (он не знает, как назвать корневой тег XML-документа). Обратите внимание, что ваша проблема, вероятно, не возникает при запросе данных в JSON (если Джексон доступен на вашем CLASSPATH).

Смотрите также (аналогичные проблемы):

+0

Я был бы удивлен, если бы это вызвало '406', однако я согласен с тем, что нужна обертка. – SingleShot

+0

Да, я видел это в другом ответе. Попытка сегодня. –

1

Трудно сказать, не видя, как вы настроили ваши мнения/просмотр арбитры. Тем не менее, клиентский URL-адрес, содержащий .htm, подозревает меня, особенно если вы используете ContentNegotiatingViewResolver. Я рекомендую отказаться от расширения файла. Браузеры автоматически используют заголовок Accept для HTML, поэтому нет необходимости использовать расширение.

+0

Очевидно, что вид распознаватель работает правильно, так как "я могу видеть способ быть вызван и возвращение без ошибок." –

+0

К сожалению, для вас не было достаточно быстро :-). –

+0

«Возврат метода» происходит до разрешения разрешения и, таким образом, не является правильной настройкой уровня сервера. – SingleShot