簡體   English   中英

從spring mvc controller返回一個簡單的map結構到ajax

[英]Returning a simple map structure from spring mvc controller to ajax

我正在使用spring mvc 4並嘗試將一個簡單的map返回到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;
    }

來自jsp文件的Ajax:

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發出警報1hello

我按預期添加了jackson jar文件(通過pom.xml):

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>

我錯過了什么嗎? 我只想返回一個簡單的映射結構(或將來的其他類結構)。

更新 :從spring控制台(不確定它是否相關): Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

提前致謝! 麥克風

我不知道它是否正確,但我解決了以下問題。

在控制器中,我將地圖轉換為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);
            }
        });

謝謝大家! 邁克}

嘗試添加consumes="application/json"produces={ "application/json"}到@RequestMapping讓spring處理你的json

更新406錯誤說明

HTTP錯誤406不可接受

介紹

客戶端(例如您的Web瀏覽器或我們的CheckUpDown機器人)可以向Web服務器(運行Web站點)指示它將從Web服務器接收的數據的特征。 這是使用以下類型的“接受標頭”完成的:

接受:客戶端接受的MIME類型。 例如,瀏覽器可能只接受它知道如何處理的返回類型的數據(HTML文件,GIF文件等)。 Accept-Charset:客戶端接受的字符集。 Accept-Encoding:客戶端接受的數據編碼,例如它理解的文件格式。 Accept-Language:客戶接受的自然語言(英語,德語等)。 Accept-Ranges:客戶端是否接受來自資源的字節范圍,即資源的一部分。 如果Web服務器檢測到它要返回的數據對客戶端不可接受,則會返回包含406錯誤代碼的標頭。

這意味着您應該以某種方式更改服務器邏輯以接受從客戶端發送的請求的MIME / Charset / Encoding等。 不能確切地說出錯了但是嘗試使用RequestMapping的標題和消耗。

您的“問題”是由於您的請求以.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建議添加produce produces={ "application/json"}不添加消耗因為你沒有發布任何JSON

一個解釋

當spring確定它轉換的表示時,它首先查看請求的路徑部分(例如.html,.json,.xml),而不是查找顯式設置轉換表示的參數,最后查找Accept標頭(所以稱PPA策略)

這就是你的例子有效的原因

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 ,而你最終會遇到問題

要了解內容協商策略的細節,你應該閱讀這個博客 ,它現在幾乎是着名的:)它還將向你展示純java配置版本

您的Ajax調用應該類似於:

$("#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);
               }
            });
            });

Spring Controller Code應如下所示:

@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 
    }

您還可以參考此鏈接以了解支持此功能的庫。

試試這個:

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

你需要這種依賴:

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM