2015-03-06 7 views
7

से एक साधारण नक्शा संरचना लौट रहा है मैं वसंत एमवीसी 4 का उपयोग कर रहा हूं और मेरे नियंत्रक से jsp फ़ाइल तक - एक सरल map AJAX पर वापस लौटने की कोशिश कर रहा हूं।वसंत एमवीसी नियंत्रक से AJAX

नियंत्रक:

jsp फ़ाइल से
@RequestMapping(value = "/ajaxtest", method = RequestMethod.GET) 
    public @ResponseBody 
    Map<String, String> myTest() { 
     System.out.println("------------------------------------test"); 

     Map<String,String> myMap = new HashMap<String, String>(); 
     myMap.put("a", "1"); 
     myMap.put("b", "2"); 
     return myMap; 
    } 

अजाक्स:

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      dataType: "json", 
      contentType: "application/json;charset=utf-8", 
      success : function(data) { 
       alert("1"); 
       alert(data); 
      } 
     }); 
    } 

लेकिन मैं किसी भी चेतावनी लेकिन सिर्फ त्रुटि HTTP/1.1 406 Not Acceptable नहीं मिल रहा है।

हालांकि, एक साधारण स्ट्रिंग को वापस करने के लिए कोड को बदलना ठीक काम करता है। नियंत्रक:

@RequestMapping(value = "/ajaxtest", method = RequestMethod.GET) 
    public @ResponseBody 
    String myTest() { 
     System.out.println("------------------------------------test"); 
     return "hello"; 
} 

अजाक्स:

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      success : function(data) { 
       alert("1"); 
       alert(data); 
      } 
     }); 
    } 

ajax से 1 और hello की सूचना देने वाले के रूप में उम्मीद।

dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.5.1</version> 
    </dependency> 

Am मैं कुछ कमी:

मैं (pom.xml से) के रूप में उम्मीद जैक्सन जार फ़ाइलें जोड़ी? मैं बस एक साधारण मानचित्रण संरचना (या भविष्य में अन्य वर्ग संरचना) वापस करना चाहता हूं।

अद्यतन: अग्रिम में Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

धन्यवाद: वसंत कंसोल से (यकीन है कि यह संबंधित नहीं है)! माइक

उत्तर

2

कोशिश consumes="application/json" और produces={ "application/json"} जोड़ने के लिए @RequestMapping को यह बताने के लिए वसंत प्रक्रिया अपने json

अद्यतन 406 त्रुटि विवरण

HTTP त्रुटि 406 अस्वीकार्य

परिचय

एक ग्राहक (उदाहरण के लिए आपका वेब ब्राउज़र या हमारे चेकअपडाउन रोबोट) वेब सर्वर (वेब ​​साइट चला रहा है) को इंगित कर सकता है कि डेटा की विशेषताओं वेब सर्वर से वापस स्वीकार करें। यह निम्नलिखित प्रकारों के 'स्वीकृत हेडर' का उपयोग करके किया जाता है:

स्वीकार करें: क्लाइंट द्वारा स्वीकार किए गए एमआईएम प्रकार। उदाहरण के लिए, एक ब्राउज़र केवल वापस प्रकार के डेटा (एचटीएमएल फाइल, जीआईएफ फाइल इत्यादि) स्वीकार कर सकता है, यह जानता है कि प्रक्रिया कैसे करें। स्वीकार्य-वर्णसेट: ग्राहक द्वारा स्वीकार किए गए चरित्र सेट। स्वीकृति-एन्कोडिंग: क्लाइंट द्वारा स्वीकार किए गए डेटा एन्कोडिंग उदा। फ़ाइल स्वरूप यह समझता है। स्वीकार्य भाषा: ग्राहक द्वारा स्वीकार की जाने वाली प्राकृतिक भाषाएं (अंग्रेजी, जर्मन आदि)। स्वीकार्य-श्रेणी: क्या क्लाइंट संसाधन से बाइट्स की सीमा स्वीकार करता है यानी संसाधन का एक हिस्सा। यदि वेब सर्वर यह पता लगाता है कि जिस डेटा को वह वापस करना चाहता है वह क्लाइंट को स्वीकार्य नहीं है, तो यह 406 त्रुटि कोड वाला हेडर देता है।

इसका मतलब है कि आपको किसी भी तरह से एमआईएम/चार्सेट/एन्कोडिंग आदि स्वीकार करने के लिए अपने सर्वर तर्क को बदलना चाहिए।क्लाइंट से भेजे गए अनुरोध का। बिल्कुल सही नहीं कह सकता कि क्या गलत है लेकिन हेडर के साथ खेलने का प्रयास करें और RequestMapping का उपभोग करें।

+0

जोड़ा गया '@RequestMapping (value = "/ ajaxtest", method = RequestMethod.GET, उपभोग = "एप्लिकेशन/जेसन", = = "एप्लिकेशन/जेसन"} उत्पन्न करता है) लेकिन समस्या को हल नहीं किया ... – Mike

0

इस प्रयास करें:

$.ajax({ 
     type:"GET", 
     url: "/ajaxtest", 
     dataType: "json", 
     contentType: "application/json;charset=utf-8", 
     success: function(data){ 
     alert("1"); 
     alert(data); 
    } 
    }); 
+0

समस्या का समाधान नहीं किया ... – Mike

-1

आप इस निर्भरता की जरूरत है:

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version></version> 
    </dependency> 

इस जोड़े पहले नहीं किया है:

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
<property name="messageConverters"> 
    <list> 
    <ref bean="jacksonMessageConverter"/> 
    </list> 
</property> 
</bean> 
+0

संस्करण '1.9.2' में' जैक्सन-मैपर-एएसएल' और 'जैक्सन-कोर-एएसएल' दोनों को जोड़ा गया लेकिन अभी भी काम नहीं करता है ... – Mike

+0

आप मूल निर्भरता हैं ठीक है, वसंत एमवीसी 4 जैक्सन 2.x का उपयोग करता है। तो मैं काफी विपरीत सलाह दूंगा, सुनिश्चित करें कि आपके पास 2.x संस्करण से पहले जैक्सन निर्भरताएं नहीं हैं। इसके अलावा, मुझे लगता है कि एकल जैक्सन-डाटाबेस डिप्टी। पर्याप्त है क्योंकि इसे कोर और एनोटेशन –

1

आपका "समस्या" आपके अनुरोध की वजह से है .html में समाप्त हो रहा है। आप इसे आपकी अपेक्षा के अनुसार

<bean id="contentNegotiationManager"    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false" /> 
    <property name="defaultContentType" value="application/json" /> 
</bean> 

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> 

काम करते हैं और से कर के रूप में @StanislavL सुझाव produces={ "application/json"} जोड़ने न जोड़ें खपत का कारण बन बनाने के लिए निम्नलिखित विन्यास जोड़ने की जरूरत है अपने किसी भी JSON

एक स्पष्टीकरण पोस्टिंग नहीं

जब वसंत उस संदर्भ को निर्धारित करता है जिस पर इसे परिवर्तित किया जाता है तो यह अनुरोध के पथ (उदाहरण के लिए .html, .json, .xml) को देखता है, यह पैरामीटर को स्पष्ट रूप से रूपांतरण प्रतिनिधित्व को सेट करने के लिए देखता है, अंत में जाता है एक स्वीकार्य हेडर के लिए (इतना कॉल करें पीपीए रणनीति)

है यही कारण है कि अपने उदाहरण से काम करता है

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      success : function(data) { 
       alert("1"); 
       alert(data); 
      } 
     }); 
    } 

आप HTML वापस हो रही है। अनुरोध के साथ हालांकि

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      dataType: "json", 
      contentType: "application/json;charset=utf-8", 
      success : function(data) { 
       alert("1"); 
       alert(data); 
      } 
     }); 
    } 

आप स्पष्ट रूप से कह रहे हैं कि आप JSON सर्वर से वापस उम्मीद तथापि, .html इशारा कर रहा है कि यह HTML बजाय होना चाहिए, और आप समस्याओं

जानने के लिए में समाप्त सामग्री वार्ता रणनीति का विवरण आपको यह blog पढ़ना चाहिए, यह अब तक लगभग प्रसिद्ध है :) यह आपको शुद्ध जावा कॉन्फ़िगरेशन संस्करण भी दिखाएगा

5

मुझे नहीं पता कि यह सही तरीका है लेकिन मैंने इसे निम्नलिखित के रूप में हल किया ।

नियंत्रक में, मैं json के लिए नक्शे परिवर्तित:

@RequestMapping(value = "/ajaxtest", method = RequestMethod.GET) 
    public @ResponseBody 
    String myTest() { 
     System.out.println("------------------------------------random"); 

     Map<String,String> myMap = new HashMap<String, String>(); 
     myMap.put("a", "1"); 
     myMap.put("b", "2"); 
     ObjectMapper mapper = new ObjectMapper(); 
     String json = ""; 
     try { 
      json = mapper.writeValueAsString(myMap); 
     } catch (JsonProcessingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return json; 
} 

और jsp में:

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      type:"GET", 
      contentType: "application/json;charset=utf-8", 
      success : function(data) { 
       alert("1"); 
       alert(data); 
       var obj = jQuery.parseJSON(data); 
       alert(obj.a); 
       alert(obj.b); 
      } 
     }); 

धन्यवाद आप सभी! माइक }

+2

को पारगमन रूप से खींचना चाहिए, यह ठीक है, लेकिन मैंने सुझाव दिया है कि आपने कॉन्फ़िगर करने का प्रयास किया है। अन्यथा आपको JSON की अपेक्षा रखने वाले प्रत्येक अनुरोध पर यह मैन्युअल कार्य करना होगा, और आप अपने लिए चीजों को संभालने वाले ढांचे का बिंदु खो देंगे –

1

आपका अजाक्स बुलाना चाहिए कुछ के समान:

$("#someId").click(function(){ 
      $.ajax({ 
       url:"getDetails",  
       type:"GET", 
       contentType: "application/json; charset=utf-8", 
       success: function(responseData){ 
        console.log(JSON.stringify(responseData)); 
        // Success Message Handler 
       },error:function(data,status,er) { 
        console.log(data) 
       alert("error: "+data+" status: "+status+" er:"+er); 
       } 
      }); 
      }); 

स्प्रिंग नियंत्रक कोड के रूप में नीचे होना चाहिए:

@RequestMapping(value="/getDetails",method=RequestMethod.GET) 
    public @ResponseBody Map<String,String> showExecutiveSummar(){ 
     Map<String,String> userDetails = new HashMap<String,String>(); 
     userDetails .put("ID","a"); 
     userDetails .put("FirstName","b"); 
     userDetails .put("MiddleName","c"); 
     userDetails .put("LastName","d"); 
     userDetails .put("Gender","e"); 
     userDetails .put("DOB","f"); 
    return userDetails 
    } 

तुम भी पुस्तकालय को समझने के लिए इस link का उल्लेख कर सकते हैं जो इस कार्यक्षमता का समर्थन करें।

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