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