Shahed Hossain Shahed Hossain - 11 days ago 4
JSON Question

How do I could add additional header on Response Body

Just see the code snippet of

SpringMVC-3.2.x
controller action method. Its quite easy to generate
JSON
but unable to add addtional custom header only for this action/specific action method for specific controller. not common for all
JSON
@ResponseBody
action method .

@RequestMapping(value="ajaxDenied", method = RequestMethod.GET)
public @ResponseBody Map<String, Object> ajaxDenied(ModelMap model) {

Map<String, Object> message = new HashMap<String, Object>();
message.put("severity", "error");
message.put("summary", "Restricted access only");
message.put("code", 200);

Map<String, Object> json = new HashMap<String, Object>();
json.put("success", false);
json.put("message", message);

return json;
}


In the different way I could add additional headers as my demand but here is some problem in generating pure
JSON
. Its generate buggy
JSON
and able to parse few browser.

@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
public ResponseEntity<String> ajaxSuccess(){
Map<String, Object> message = new HashMap<String, Object>();

message.put("severity", "info");
message.put("location", "/");
message.put("summary", "Authenticated successfully.");
message.put("code", 200);

Map<String, Object> json = new HashMap<String, Object>();
json.put("success", true);
json.put("message", message);

String data = "";
try {
ObjectMapper mapper = new ObjectMapper();
data = mapper.writeValueAsString(json);
} catch (Exception e) { //TODO
}
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json; charset=UTF-8");
headers.add("X-Fsl-Location", "/");
headers.add("X-Fsl-Response-Code", "302");
return (new ResponseEntity<String>(data, headers, HttpStatus.OK));
}


this action method could generate
JSON
String with escape character rather than pure
JSON
so depend on browser how it will be parse, Its cause failure for chrome. The output just look like

"{\"message\":{\"summary\":\"Authenticated successfully.\",\"location\":\"/\",\"severity\":\"info\",\"code\":\"200\"},\"success\":true}"


but our desired output

{
"message":{
"summary": "Authenticated successfully.",
"location":"/",
"severity":"info",
"code":"200"
},
"success":true
}


I want to generate pure
JSON
with additional headers based on conditions for specific action of specific controller.

Answer

Here is the solution as the suggestion of M. Deinum

@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
public ResponseEntity<Map<String, Object>> ajaxSuccess(){
    Map<String, Object> message = new HashMap<String, Object>();

    message.put("severity", "info");
    message.put("location", "/");
    message.put("summary", "Authenticated successfully.");
    message.put("code", 200);

    Map<String, Object> json = new HashMap<String, Object>();
    json.put("success", true);
    json.put("message", message);

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=UTF-8");
    headers.add("X-Fsl-Location", "/");
    headers.add("X-Fsl-Response-Code", "302");
    return (new ResponseEntity<Map<String, Object>>(json, headers, HttpStatus.OK));
}
Comments