2011-10-11 18 views
5

में जेएसओएन प्रतिक्रिया बल मैं स्प्रिंग 3.0.6 का उपयोग कर रहा हूं और मेरे पास सर्वर पर फ़ाइलों को अपलोड करने के लिए एक नियंत्रक है। मैं ब्राउज़र के लिए XmlHttpRequest का उपयोग करके अपलोड करने के लिए एक स्क्रिप्ट का उपयोग कर रहा हूं, जबकि बाकी ब्राउज़र ब्राउज़र (छुपा) मल्टीपार्ट फॉर्म सबमिट करते हैं।स्प्रिंग एमवीसी, सादा अनुरोध

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

मैं समझ है कि इस शीर्ष लेख की वजह से नियंत्रक जो प्रतिक्रिया के साथ @ResponseBody उत्तरों के साथ चिह्नित है JSON के बजाय एक्सएमएल में बदल दिया गया: समस्या फिर भी है कि यह निम्नलिखित हेडर भेजता है जब एक फ़ॉर्म सबमिट किया जाता है। फॉर्म सबमिट अनुरोध हैकिंग के बिना इसे पाने का कोई तरीका है?

उत्तर

8

आप @RequestMapping(produces = "application/json") का उपयोग कर JSON मजबूर कर सकते हैं। मुझे याद नहीं है कि यह 3.0 में उपलब्ध है लेकिन यह निश्चित रूप से 3.1 और 3.2 में उपलब्ध है।

जैसा कि अन्य ने नोट किया, जैक्सन को आपके क्लासपाथ पर होना चाहिए।

+0

यह अच्छा लग रहा है है, लेकिन जैसा कि आप ने कहा कि अगर यह यह करने के लिए इसके अलावा में 3.0 – nvrs

+0

वसंत के आप की जरूरत है कि reqeust हैडर स्वीकार करें, इस तरह होगा लागू है मुझे पता नहीं स्वीकार करें: "application/json; charset = utf-8", तो वसंत MVC जो कनवर्टर सही जवाब के निर्माण के लिए उपयोग करने के लिए पता चल जाएगा। – lukass77

1

आप एक JSON प्रतिक्रिया चाहते हैं, तो आप आसानी से अपने classpath पर Jackson JARs होने से पूरा कर सकते हैं कि। स्प्रिंग उन पर ऑटो-जादुई रूप से उठाएगी और आपके @ResponseBody को JSON में परिवर्तित कर देगा।

+1

लेकिन मैं करता हूं, मैं जैक्सन का उपयोग कर रहा हूं। एक ही विधि जब यह स्वीकार करने के अनुरोध का जवाब देती है: एप्लिकेशन/जेसन हेडर इसे JSON के रूप में भेजता है। लेकिन ऐसा लगता है कि वसंत MVC XML के साथ उत्तर जब यह अनुपस्थित – nvrs

0

मैं इसे से हो रही @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 स्थापित करने का प्रयास किया लेकिन मैं जेसन को सभी एचएमटीएल असाइन करके किसी अन्य नियंत्रक को तोड़ना नहीं चाहता। इसके अलावा, मैं केवल एक कस्टम viewresolver के माध्यम से इस विधि के लिए यह करने के लिए कोशिश की, लेकिन जब मैं सेटअप एक jsonview और BeanNameViewResolver का उपयोग हालांकि प्रतिक्रिया सही ढंग से JSON करने के लिए सर्वर एक HttpRequestMethodNotSupportedException: अपवाद फेंकता बदल जाती है, अनुरोध 'POST' के साथ समर्थन किया और सेट नहीं 404 की स्थिति।

2

धन्यवाद! मुझे बिल्कुल वही समस्या थी और आपकी पोस्ट ने मेरी समस्या का समाधान किया।

यूआई मैं इस फाइल अपलोड प्लगइन के साथ 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(); 
    } 

} 
संबंधित मुद्दे