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

时间:2015-03-06 07:05:54

标签: 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;
    }

来自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";
}   

的Ajax:

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>

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

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

提前致谢! 麦克

6 个答案:

答案 0 :(得分:8)

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

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

谢谢大家! 麦克风         }

答案 1 :(得分:2)

尝试将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的标题和消费。

答案 2 :(得分: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

解释

当spring确定它转换的表示时,它首先查看请求的路径部分(例如.html,.json,.xml),而不是查找显式设置转换表示的参数,最后去找一个接受标题(所以调用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,而您最终会遇到问题

要了解内容协商策略的详细信息,您应该阅读此blog,它现在几乎是着名的:)它还将向您展示纯Java配置版本

答案 3 :(得分:1)

您的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 
    }

您也可以参考此link来了解支持此功能的库。

答案 4 :(得分:0)

试试这个:

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

答案 5 :(得分:-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>