2011-10-11 35 views
5

Spring 3.0.6 kullanıyorum ve dosyaları sunucuya yüklemek için tek bir denetleyicim var. Tarayıcıların geri kalanı (gizli) çok parçalı bir form gönderirken, onu destekleyen tarayıcılar için XmlHttpRequest kullanarak bir komut dosyası kullanıyorum.Spring MVC, JSON yanıtını düz talebe zorlar

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

nedeniyle bu başlığa tepki ile @ResponseBody cevaplar ile işaretlenmiştir Kontrolör yerine JSON XML dönüştürülmüş olduğunu anlamaya: Sorun ancak form gönderildiğinde aşağıdaki başlığı gönderir olmasıdır. Form gönderme isteğini kesmeden bunun üstesinden gelmenin bir yolu var mı?

cevap

8

Sen @RequestMapping(produces = "application/json") kullanarak JSON zorlayabilir. Bunun 3.0'da mevcut olup olmadığını hatırlamıyorum ama kesinlikle 3.1 ve 3.2'de mevcut. Diğerleri de belirttiği gibi, Jackson'ın sınıfınızda olması gerekiyor.

+0

yok olduğunda XML ile cevap veriyor gibi görünüyor. Bu iyi görünüyor, ancak eğer buna ek olarak Spring 3.0 – nvrs

+0

için geçerli olup olmadığını bilmediğiniz gibi, reqeust Accept üstbilgisine sahip olmanız gerekir Kabul: "application/json; charset = utf-8", bu nedenle bahar mvc doğru cevabı oluşturmak için hangi çeviricinin kullanılacağını bilir. – lukass77

1

JSON yanıtı istiyorsanız, sınıf yolunuzda Jackson JARs numaralı telefonu kullanarak bunu kolayca yapabilirsiniz. Spring, otomatik olarak orada olmanızı sağlayacak ve @ResponseBody ürününü JSON'a dönüştürecektir.

+1

Ama ben Jackson'ı kullanıyorum. Aynı yöntemi kabul ederek bir talebe cevap verdiğinde: application/json başlığı JSON olarak gönderir. Ancak Spring MVC, – nvrs

0

ben yani

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(); 

herkes başka bir yol biliyor mu, bu @ResponseBody kapalı kurtularak çalışmak ve yerine manuel (her zaman Jackson kullanarak) dönüşüm yaparak yaptı? ContentNegotiatingViewResolver'u kurmayı denedim, ancak tüm hmtl'yi json'a atayarak başka bir denetleyiciyi kırmak istemiyorum. Ayrıca, bu yöntem için yalnızca özel bir viewresolver aracılığıyla yapmaya çalıştım ancak jsonview kurduğumda ve BeanNameViewResolver kullanıp yanıtı doğru bir şekilde JSON'a dönüştürdüğümde, sunucu " HttpRequestMethodNotSupportedException: isteğini atar ve Request yöntemi" POST "desteklenmez. durum 404.

2

Teşekkür ederiz! Tam olarak aynı sorunu yaşıyordum ve mesajınız benim problemimi çözdü. Bu dosya yükleme eklenti ile JQuery kullanıyorum UI üzerinde

: https://github.com/blueimp/jQuery-File-Upload/wiki

İşte benim tamamlanan yöntemi (eksi biz mantığı) var:

@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(); 
    } 

}