从spring控制器返回JSONObject会产生406错误

时间:2014-12-24 22:30:41

标签: java spring spring-mvc

我的Spring JSON应用程序Spring控制器返回一个JSONObject。在访问网址时,我收到406错误页面。 它在我返回String或ArrayList时有效。

Spring Controller:

package com.mkyong.common.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.json.JSONException;
import org.json.JSONObject;

@Controller
public class JSONController {

    @RequestMapping("/test")
    @ResponseBody
    public JSONObject test() {
        try {
            JSONObject result = new JSONObject();
            result.put("name", "Dade")
                    .put("age", 23)
                    .put("married", false);
            return result;
        } catch (JSONException ex) {
            Logger.getLogger(JSONController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

}

我该如何解决这个问题?感谢帮助。我是Spring MVC的新手,在现有的SO答案中无法解决这个问题。

2 个答案:

答案 0 :(得分:0)

你正试图为你自动手动执行Spring MVC。 Spring会自动推断出返回类型的表示并进行转换。如何做到这一点,你可以从http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc学习。在你的情况下,它转换为JSON。

  

当我返回String或ArrayList

时,它可以工作

引擎盖下发生的事情是Spring MVC正在使用Jackson库,将返回类型转换为JSON。因为转换String或List类型没有问题,所以一切正常。

你发布的代码中发生的事情是,Jackson的对象映射器试图将JSONObject实例转换为JSON,这失败了,因为jackson期望JSONObject实例不是POJO对象。

要让它工作,您应该简单地编写POJO并将其返回。像

这样的东西
public class Person {

    private String name;
    private Integer age;
    private Boolean married;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getMarried() {
        return married;
    }

    public void setMarried(Boolean married) {
        this.married = married;
    }
}

并将您的方法更改为

@RequestMapping("/test")
    @ResponseBody
    public Person test() {
        Person person = new Person();
        person.setName("Dade");
        person.setAge(23);
        person.setMarried(false);
        return person;
    }

对于您的错误,您将在工作示例中看到相同的异常(例如,删除getter和setter,或者错误地命名),尝试转换为表示时发生异常并且出现406错误< / p>

答案 1 :(得分:0)

我认为您需要在@RequestMapping中设置标头并返回HashMap

@RequestMapping(value = "json", method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody
Map<String, String> helloJson() {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("k1", "v1");
    map.put("k2", "v2");
    map.put("k3", "v3");
    return map;
}