当前位置: 首页 > 知识库问答 >
问题:

将简单的映射结构从Spring mvc控制器返回到ajax

元望
2023-03-14

我正在使用springmvc4,并试图将一个简单的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 文件的阿贾克斯:

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不可接受

然而,更改代码以返回一个简单的字符串也可以。控制器:

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

我是不是遗漏了什么?我只想返回一个简单的映射结构(或者以后其他类结构)。

更新:从spring控制台(不确定它是否相关):Resolving exception From handler[null]:org.springframework.web。HttpMediaTypeNotAcceptableException:找不到可接受的表示形式

先谢谢你!麦克

共有3个答案

艾敏学
2023-03-14

您的“问题”是由于您的请求以.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的建议添加products={“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暗示它应该是超文本标记语言,而你最终会遇到问题

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

劳烨
2023-03-14

尝试将消耗=“应用程序/json”生成={“应用程序/json”}添加到@RequestMapping,让spring处理您的json

更新 406 错误说明

HTTP错误406不可接受

导言

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

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

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

吴炎彬
2023-03-14

我不知道这是不是正确的方法,但我如下解决了它。

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

谢谢大家!迈克}

 类似资料:
  • 我正在使用Spring形式。我只需要得到Staemap作为响应,但我得到的是整个jsp页面作为响应。

  • 问题内容: 我试图创建一个服务来获取json并将其传递给我homeCtrl我可以获取数据,但是当将其传递给我的homeCtrl时,它总是返回undefined。我卡住了。 我的服务: 我的家庭控制器: 问题答案: 您应该从函数返回promise ,当它被解析后,它应该从该函数返回。 厂 同样在控制器内部,您应该调用factory函数,并在service函数解析该调用并将其分配给 码

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!

  • 我的问题可以通过下面的(简化的)例子得到最好的描述: 给定一个异步HTTP客户端,该客户端返回<code>Future 对资源A执行GET 一旦GET完成,就对资源B执行GET 我的具体问题是,如何从映射器中返回未来,而资源B必须为 返回一个< code>Future,而< code>Future#map方法希望我传递一个从提供的值同步映射的映射器。 从JavaScript世界的< code>Pr

  • 请帮助我解决这个问题:我不知道如何将数据从thymeleaf视图传送到controller,那个预期的数据作为哈希映射?所以让我更详细地解释一下。 我有下一个pojo,它用作我的hashMap数据的包装器。看起来是这样的: Controller具有参数model属性的方法和另一个POJO: 视图如下所示: 为了提交数据,我应该写些什么?在我的例子中,驱动程序是地图的一个键,用户在相关输入字段中输入

  • 如果可以从Spring返回,我很好奇 这样做可以吗?我试过了,Spring返回的不是流的值。 我应该继续返回