tellraw book json spring spring-mvc

json - book - tellraw generator 1.13 2



¿Cómo puedo agregar un encabezado adicional en el cuerpo de la respuesta? (3)

Aquí está la solución como sugerencia de 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)); }

Solo vea el fragmento de código del método de acción del controlador SpringMVC-3.2.x . Es bastante fácil generar JSON pero no se puede agregar un encabezado personalizado adicional solo para esta acción / método de acción específico para un controlador específico. no es común para todos los @ResponseBody acción JSON @ResponseBody .

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

De manera diferente, podría agregar encabezados adicionales como mi demanda, pero aquí hay un problema al generar JSON puro. Se genera Buggy JSON y es capaz de analizar algunos navegadores.

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

este método de acción podría generar una cadena JSON con carácter de escape en lugar de JSON puro, por lo que depende del navegador cómo se analizará, por lo que se produce un error en Chrome. La salida se parece a

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

pero nuestra salida deseada

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

Quiero generar JSON puro con encabezados adicionales basados ​​en condiciones para la acción específica de un controlador específico.


Puede agregar encabezados al generador de ResponseEntity. Creo que está más limpio de esta manera.

import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8"); ResponseEntity.ok() .headers(headers) .body(data);


También puede usar HttpServletResponse para agregar su estado y encabezados de una manera más fácil:

@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET) @ResponseBody public String ajaxSuccess(HttpServletResponse response) { response.addHeader("header-name", "value"); response.setStatus(200); return "Body"; }

Por lo tanto, debe agregar la siguiente dependencia de maven como se indica :

<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>7.0.53</version> <scope>provided</scope> </dependency>