2013-11-14 2 views
11

Просто просмотрите фрагмент кода из метода действий контроллера SpringMVC-3.2.x. Его довольно легко создать JSON, но не удалось добавить дополнительный пользовательский заголовок только для этого действия/конкретного действия для конкретного контроллера. не общий для всех JSON@ResponseBody способ действия.Как я могу добавить дополнительный заголовок в Response Body

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

В-другому я мог бы добавить дополнительные заголовки, как мое требование, но здесь есть некоторые проблемы в создании чистого JSON. Его генерация багги JSON и возможность разбора нескольких браузеров.

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

этот метод действия может генерировать JSON строку с экранирующего символа, а не чистого JSON так зависит от браузера, как это будет разобрать, его причина отказа для хрома. Выход только выглядеть

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

но наш желаемый результат

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

Я хочу, чтобы генерировать чистый JSON с дополнительными заголовками на основе условий для конкретного действия конкретного контроллера.

+1

Почему вы конвертируете сами? Пусть Spring справится с этим для вас ... Просто верните «ResponseEntity >» вместо 'ResponseEntity ', удалите картограф и дайте весне сделать тяжелый подъем. –

+0

Да, вы правы. Я был настолько глуп, что не мог построить такой тип логики. Большое спасибо за ваше предложение. –

+0

Вы нашли решение этого? У меня такая же проблема после обновления зависимостей. Тело моего ResponseEntity и кавычки сбегают с \. – l15a

ответ

7

Вот решение, как по предложению М. 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)); 
} 
6

Вы также можете использовать HttpServletResponse для добавления статуса и заголовки в более простой способ:

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

Таким образом, вы необходимо добавить следующую зависимость от maven как предусмотрено:

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

Вы можете добавить заголовки в построитель ResponseEntity. Я думаю, что это чище.

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); 
Смежные вопросы