2017-12-08 7 views
1

私はSpring 4.3.8.RELEASEを使用しています。私は特定の禁止されたエラーのためのエラーメッセージを設定したいと思います。私は私のコントローラにこれを持っています。 "response"は "javax.servlet.HttpServletResponse"タイプです。HttpServletResponseバッファにコンテンツを出力するにはどうすればよいですか?

 response.setStatus(HttpServletResponse.SC_FORBIDDEN); 
     response.setContentLength(errorMsg.length()); 
     byte[] buffer = new byte[10240]; 
     final OutputStream output = response.getOutputStream(); 
     output.write(buffer, 0, errorMsg.length()); 
     output.flush(); 

しかし、コンテンツは、少なくとも私はユニットテストでそれを見ることができない、返さ取得していないように見える...

final MvcResult result = mockMvc.perform(get(contextPath + "/myurl") 
        .contextPath(contextPath) 
        .principal(auth) 
        .param("param1", param1) 
        .param("param2", param2)) 
     .andExpect(status().isForbidden()) 
     .andReturn(); 
    // Verify the error message is correct 
    final String msgKey = "error.code"; 
    final String errorMsg = MessageFormat.format(resourceBundle.getString(msgKey), new Object[] {}); 
    Assert.assertEquals("Failed to return proper error message.", errorMsg, result.getResponse().getContentAsString()); 

アサーションは、応答文字列と言って失敗しました空だった。応答をHttpServletResponseバッファに書き込む正しい方法は何ですか?

答えて

2

応答エンティティを使用することができます。

何か

よう
response.getWriter().write(errorMsg) 

問題

+0

はい、私はあります。 「output.write(buffer、0、errorMsg.length())」の行を参照してください。 – Dave

+2

いいえ、 'errorMsg.length()'バイトを 'buffer'から0に向かって出力して出力します。しかし、 'errorMsg'をコピーしたことがないので、' buffer'はすべて0です。 –

0

あなたがoutputまたはbuffererrorMsgを書くことはありません

@RequestMapping("/handle") 
public ResponseEntity<String> handle() { 

    HttpHeaders responseHeaders = new HttpHeaders(); 
    responseHeaders.setLocation(location); 
    responseHeaders.set("MyResponseHeader", "MyValue"); 
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.FORBIDDEN); 
} 

Spring Response Entity

+0

を扱う春例外にいくつかの「オールディーズ - しかし、ゴールディ」情報です。 HttpSErvletResponseを指定して出力文字列を生成するにはどうすればよいですか?あなたの答えはこれに対処していません。ありがとう、 - – Dave

0

良いことがthrowに引数としてHttpServletResponseを渡すか、それはあなたの使用を提供する場合(既存の例外のいずれかを使用してカスタム例外だろうに修正する必要がありますケースのようにエラーがコントローラーメソッドの外で処理されるようにします(別の懸念事項、良い方法と考えられます)。

そうでない場合は、コントローラメソッドで直接応答を設定できます。

そうのようなので、両方のケースでは、あなたは、HttpServletResponsesendErrorメソッドを使用することができます。

// your controller (or exception) method 
    try { 
     response.sendError(HttpStatus.FORBIDEN.value(), "My custom error message") 
     } catch (IOException e) { 
    // handle if error could not be sent 
     } 
    } 

これは、所望のHttpStatusと応答として文字列を出力します。

また、ここではたぶん私はより明確になっているshoudl here

+0

THanks。 JUnitテストコードでこれをどのように確認するのですか?私はあなたのコードを入れて、私はそれがデバッグ中に実行されて見ることができますが、 "Assert.assertEquals("適切なエラーメッセージを返すことができませんでした "、errorMsg、result.getResponse()。getContentAsString());" "result.getResponse()。getContentAsString()"が空であると不満を表明します。 – Dave

+0

@Dave @ RestController'を使用している場合、JSONレスポンスから読み込みます。それで、 'mockMvc.perform(.....) .andExpect(content()。contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath(" $。error.message ")。value("私のカスタムエラーメッセージ"));'あなたはPostmanなどを介して電話をかけることでjson構造を見ることができます –

関連する問題