Как в Spring 3 задавать при сериализации в JSON другой Content-Type, либо отлавливать любой ответ с сервера на клиенте в ExtJS?

Рейтинг: 4Ответов: 1Опубликовано: 27.06.2011

Здравствуйте.
Столкнулся с такой задачей:
     Использую в разработке Ext Js 3.1 и Spring 3. Используя функцию

fp.getForm().submit({
    url: 's3/uploadform.form',
    waitMsg: 'Загрузка файла...',
    success: function(fp, o){
        msg('Success', 'Загрузка завершена');
    }
});

Ext JS отправляет данные на сервер, где происходят нужные операции, и клиент ждет от сервера ответ

{success:true}

В Spring 3 есть удобная вещь, которая автоматически сериализует возвращаемые объекты в JSON при помощи библиотеки jackson. Для удобства, я создал объект со всеми нужными полями плюс поле boolean success. Он прекрасно срабатывает, и отправляет назад клиенту

{"success":true, "anyField":"anyString"}

При этом используется подобная функция:

@RequestMapping(value = "/uploadform.form", method = RequestMethod.POST)
public @ResponseBody
TransactionResultMessage uploadForm(@Valid ImportXfd xfd, 
                                    BindingResult validationResults) {
    /*
     Тут все что надо и возвращение моего объекта
     TransactionResultMessage 
    */
}

И Ext JS не хочет принимать это. В консоли ошибок JavaScript браузера, выводится

Resource interpreted as Document but transferred with MIME type application/json.

Такое выводится в google chrome. Mozilla вообще с какого-то этапа стала предлагать сохранить пришедший ответ с сервера на диске. Тут, как я начал понимать, ExtJs ругается на то, что приходит тип application/json. Но этот MIME тип генерирует Spring, и у меня, логически, нет доступа к этому. Так вот новый вопрос:
      Как мне сделать Content-type, отправляемый с сервера, типа text/html, либо принимать любой ответ с сервера как текстовый?

Заранее спасибо.

Ответы

▲ 3Принят

Как утверждают доки ExtJS, форма ожидает text/html и с этим, видимо, ничего не поделать. Но можно попробовать возвращать с сервера в методе обработчике бин, обернутый в ResponseEntity:

TransactionResultMessage message;
// Тут все что надо
HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("text", "html", Charset.forName("UTF-8")));
return new ResponseEntity<TransactionResultMessage>(message, headers, HttpStatus.OK);