Java 来自SpringMVC控制器的JSON响应不工作

Java 来自SpringMVC控制器的JSON响应不工作,java,json,spring-mvc,controller,Java,Json,Spring Mvc,Controller,我想从SpringMVC控制器响应JSON对象或数组。从这两个和教程中,我尝试了。 只有在响应为字符串时,我才能成功。但当响应在对象或列表中时,它对我不起作用 //It works @RequestMapping(value = "/angular", method = RequestMethod.GET) public @ResponseBody String getAllProfiles( ModelMap model ) { String jsonData = "[{\"firstname

我想从SpringMVC控制器响应JSON对象或数组。从这两个和教程中,我尝试了。 只有在响应为字符串时,我才能成功。但当响应在对象或列表中时,它对我不起作用

//It works
@RequestMapping(value = "/angular", method = RequestMethod.GET)
public @ResponseBody String getAllProfiles( ModelMap model ) {
String jsonData = "[{\"firstname\":\"ajitesh\",\"lastname\":\"kumar\",\"address\":\"211/20-B,mgstreet\",\"city\":\"hyderabad\",\"phone\":\"999-888-6666\"},{\"firstname\":\"nidhi\",\"lastname\":\"rai\",\"address\":\"201,mgstreet\",\"city\":\"hyderabad\",\"phone\":\"999-876-5432\"}]";
return jsonData;
}
输出为:

但问题就在这里

@RequestMapping(value = "mkyoung", method = RequestMethod.GET)
    public @ResponseBody Shop getShopInJSON() {

        Shop shop = new Shop();
        shop.setName("G");
        shop.setStaffName(new String[] { "mkyong1", "mkyong2" });
        return shop;
    }
它表明,

HTTP ERROR 406

Problem accessing /mkyoung.html. Reason:

    Not Acceptable
但如果我将其更改为
toString()
, 它可以工作,但输出不正确

@RequestMapping(value = "mkyoung", method = RequestMethod.GET)
public @ResponseBody String getShopInJSON() {

    Shop shop = new Shop();
    shop.setName("G");
    shop.setStaffName(new String[] { "mkyong1", "mkyong2" });
    return shop.toString();

}

但我需要JSON对象或对象数组作为响应。问题是什么?我在我的
pom.xml

<dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.10</version>
    </dependency>
我的dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <mvc:annotation-driven />

    <context:component-scan base-package="com.sublime.np.controller" />

    <bean id="tilesConfigurer"
        class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/defs/general.xml</value>
            </list>
        </property>
    </bean>

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.tiles3.TilesView" />
    </bean>

</beans>
但它显示了同样的错误。
给定带有POJO类型返回类型的
@ResponseBody
,带有
@EnableWebMvc
的默认MVC配置,以及类路径上的Jackson,Spring将尝试将POJO序列化为JSON并将其写入响应体

因为它正在编写JSON,所以它将尝试将
application/JSON
作为
Content-type
头来编写。HTTP规范要求服务器只响应属于请求中
Accept
头的内容类型

您发送的请求似乎带有不适当的
Accept
头,该头不包含
application/json
。解决这个问题


请注意,您正在将请求发送到

/mkyoung.html
Spring默认使用基于某些扩展的内容协商。例如,使用
.html
,Spring会认为请求应该生成
文本/html
内容,这与您想要发送的
应用程序/json
相反

因为您的处理程序已经映射到

@RequestMapping(value = "/mkyoung", method = RequestMethod.GET)
只需将请求发送到相应的URL,以
/mkyoung
结尾。(去掉
.html
扩展名。)

还要添加jackson core

<dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>2.5.1</version>
</dependency>

我在dispatcher-servlet.xml中添加了。我在哪里可以添加application/json?@Romeo在您的请求中。如果您只是通过浏览器发送GET请求,则无法直接执行。打开浏览器的网络控制台,找到您的请求,更改其标题并重新发送。否则,请使用不同的HTTP客户端。@Romeo您说过您的类路径上有jackson 1?你能给我们看一下你的配置吗?是的。我已经贴了。请参阅此问题更新部分之前的内容。@Romeo Oh。我刚刚注意到您正在将请求发送到
mkyong.html
。我相信Spring使用基于某些扩展的默认内容协商,
.html
就是其中之一。去掉
.html
扩展名。您的处理程序被映射到
/mkyoung
。此外,您还可以为Spring启用调试日志。他们会解释发生了什么。小心这个版本的杰克逊!它与较新版本的spring(我认为是4.x)不兼容。您必须使用:com.fasterxml.jackson.core jackson databind 2.5.1
@RequestMapping(value = "/mkyoung", method = RequestMethod.GET)
<dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>2.5.1</version>
</dependency>
@RequestMapping(value = "mkyoung", method = RequestMethod.GET)
    public @ResponseBody Object getShopInJSON() {

        Shop shop = new Shop();
        shop.setName("G");
        shop.setStaffName(new String[] { "mkyong1", "mkyong2" });
        Shop shop1 = new Shop();
        shop1.setName("G1");
        shop1.setStaffName(new String[] { "mkyong1", "mkyong2" });
        List<Shop> shops = new ArrayList<Shop>();
        shops.add(shop1);
        shops.add(shop);
        return shops;
}