Returning JSONObject from spring controller gives 406 error

℡╲_俬逩灬. 提交于 2020-01-14 09:07:12

问题


My Spring Controller of Spring JSON application returns a JSONObject. On accessing the url, i am getting 406 error page. It works when i return String or 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;
    }

}

How can i resolve this issue? Thanks for help. I am new to Spring MVC, couldn't found resolution to this issue in the existing SO answers.


回答1:


You're trying to manually do something that Spring MVC already it automatically for you. Spring automatically deduces a representation of the returning type and does a converstion. How it does it you can learn from http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc. In your case its converting to JSON.

It works when i return String or ArrayList

What happens under the hood is that Spring MVC is using Jackson library, to convert the return type to JSON. And since it has no issue converting the String or List type, all works OK.

What happens in the code you've posted is that, Jackson's object mapper is trying to convert JSONObject instance to JSON, and this fails, cause jackson expects a POJO object which JSONObject instance isn't.

To have it work you should simply write your POJO and return it. So something like

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;
    }
}

and have your method changed to

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

For what concerns your error, the same exception you will see in the working example if you for example delete getters and setters, or name them wrongly, an exception happens while trying to convert to a representation and you get a 406 error




回答2:


I think you need to set headers in @RequestMapping and return 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;
}


来源:https://stackoverflow.com/questions/27642708/returning-jsonobject-from-spring-controller-gives-406-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!