从弹簧控制器返回 JSONObject 会给出 406 错误



我的Spring Controller of Spring JSON 应用程序返回一个 JSONObject。在访问 url 时,我收到 406 错误页面。当我返回字符串或数组列表时,它可以工作。

弹簧控制器:

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答案中找到此问题的解决方案。

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

当我返回字符串或数组列表时它可以工作

幕后发生的事情是,Spring MVC 正在使用 Jackson 库将返回类型转换为 JSON。由于转换字符串或列表类型没有问题,因此一切正常。

在您发布的代码中发生的情况是,杰克逊的对象映射器正在尝试将 JSONObject 实例转换为 JSON,但这失败了,因为杰克逊需要一个 POJO 对象,而 JSONObject 实例不是。

要让它工作,您应该简单地编写您的 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 错误

我认为您需要在@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;
}

相关内容

最新更新