26

SpringMVC-3.2.xコントローラー アクション メソッドのコード スニペットを参照してください。生成するのは非常に簡単JSONですが、特定のコントローラーのこのアクション/特定のアクション メソッドのみにカスタム ヘッダーを追加することはできません。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;
}

別の方法で、要求に応じて追加のヘッダーを追加できますが、純粋な生成に問題があります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特定のコントローラーの特定のアクションの条件に基づいて、追加のヘッダーを使用して純粋に生成したいと考えています。

4

3 に答える 3

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>
于 2016-11-21T10:23:46.043 に答える