从spring mvc controller返回一个简单的map结构到ajax

Mik*_*ike 11 java ajax json spring-mvc jackson

我正在使用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;
    }
Run Code Online (Sandbox Code Playgroud)

来自jsp文件的Ajax:

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

但我没有得到任何警报,只是错误HTTP/1.1 406 Not Acceptable.

但是,更改代码以返回一个简单的字符串工作正常.控制器:

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

阿贾克斯:

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

警报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>
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?我只想返回一个简单的映射结构(或将来的其他类结构).

更新:从弹簧控制台(不确定它是否相关): Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

提前致谢!麦克风

Mik*_*ike 9

我不知道它是否正确,但我解决了以下问题.

在控制器中,我将地图转换为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;
}
Run Code Online (Sandbox Code Playgroud)

在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);
            }
        });
Run Code Online (Sandbox Code Playgroud)

谢谢大家!迈克}

  • 没关系,但你是否按照我的建议尝试配置.否则,您将不得不对每个需要JSON的请求执行此手动工作,并且您将失去为您处理事情的框架点 (2认同)

Sta*_*avL 2

尝试将consumes="application/json"和 添加produces={ "application/json"}到 @RequestMapping 让 spring 处理你的 json

更新406错误描述

HTTP 错误 406 不可接受

介绍

客户端(例如您的 Web 浏览器或我们的 CheckUpDown 机器人)可以向 Web 服务器(运行网站)指示它将接受从 Web 服务器返回的数据的特征。这是使用以下类型的“接受标头”完成的:

Accept:客户端接受的MIME类型。例如,浏览器可能只接受它知道如何处理的后退类型数据(HTML 文件、GIF 文件等)。Accept-Charset:客户端接受的字符集。Accept-Encoding:客户端接受的数据编码,例如它理解的文件格式。Accept-Language:客户端接受的自然语言(英语、德语等)。Accept-Ranges:客户端是否接受来自资源的字节范围,即资源的一部分。如果Web服务器检测到客户端不接受它想要返回的数据,它会返回包含406错误代码的标头。

这意味着您应该以某种方式更改服务器逻辑以接受从客户端发送的请求的 MIME/字符集/编码等。不能确切地说出了什么问题,但尝试使用请求映射的标头和消耗。