Spring MVC, принудительный ответ JSON в виде простого запроса - PullRequest
5 голосов
/ 11 октября 2011

Я использую Spring 3.0.6, и у меня есть один контроллер для загрузки файлов на сервер. Я использую скрипт для загрузки с использованием XmlHttpRequest для браузеров, которые его поддерживают, в то время как остальные браузеры отправляют (скрытую) многочастную форму. Однако проблема заключается в том, что при отправке формы она отправляет следующий заголовок:

Accept  text/html, application/xhtml+xml, */*

Я полагаю, что благодаря этому заголовку Контроллер, отмеченный @ResponseBody, отвечает с ответом, преобразованным в XML вместо JSON. Есть ли способ обойти это без взлома формы отправить запрос?

Ответы [ 4 ]

8 голосов
/ 10 апреля 2013

Вы можете форсировать JSON, используя @RequestMapping(produces = "application/json"). Я не помню, доступно ли это в 3.0, но наверняка оно доступно в 3.1 и 3.2.

Как уже отмечалось, Джексон должен быть на вашем учебном курсе.

2 голосов
/ 05 ноября 2011

Спасибо!У меня была точно такая же проблема, и ваше сообщение решило мою проблему.

В пользовательском интерфейсе я использую JQuery с этим плагином загрузки файлов: https://github.com/blueimp/jQuery-File-Upload/wiki

Вот мой завершенный метод (залогика бизнеса):

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
public void  handleUpload( @RequestParam("fileToUpload") CommonsMultipartFile uploadFile, ServletResponse response){

    List<UploadStatus> status = new ArrayList<UploadStatus>();
    UploadStatus uploadStatus = new UploadStatus();
    status.add(uploadStatus); 

    if(uploadFile == null || StringUtils.isBlank(uploadFile.getOriginalFilename())){
        uploadStatus.setMessage(new Message(MessageType.important, "File name must be specified."));
    }else{
        uploadStatus.setName(uploadFile.getOriginalFilename());
        uploadStatus.setSize(uploadFile.getSize());
    }
    ObjectMapper mapper = new ObjectMapper(); 
    try {
        JsonGenerator generator = mapper.getJsonFactory().createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8); 
        mapper.writeValue(generator, status); 
        generator.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
1 голос
/ 12 октября 2011

Если вы хотите получить ответ JSON, вы можете легко сделать это, имея JAR Джексона на вашем пути к классам.Spring автоматически подхватит их и преобразует ваш @ResponseBody в JSON.

0 голосов
/ 12 октября 2011

Я заставил его работать, избавившись от @ResponseBody и вместо этого вручную выполнив преобразование (всегда используя Джексона), то есть

Response r = new Response();
    ObjectMapper mapper = new ObjectMapper();
    JsonGenerator generator = mapper.getJsonFactory().createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8);
    try {
        File f = uploadService.getAjaxUploadedFile(request);
        r.setData(f.getName());
    } catch (Exception e) {
        logger.info(e.getMessage());
        r = new Response(new ResponseError(e.getMessage(), ""));
    }
    mapper.writeValue(generator, r);
    generator.flush();

Кто-нибудь знает другой способ?Я попытался настроить ContentNegotiatingViewResolver , но я не хочу нарушать какие-либо другие контроллеры, назначая все hmtl для json.Кроме того, я попытался сделать это для этого метода только с помощью специального средства просмотра изображений, но когда я настраиваю jsonview и использую BeanNameViewResolver, хотя ответ правильно преобразуется в JSON, сервер выдает исключение HttpRequestMethodNotSupportedException:, при этом метод запроса POSTподдерживается и устанавливается статус 404.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...