6

SpringMVC応答の結果をログに記録するインターセプターがあります。私のすべての応答は、JSON本文の内容を持つResponseEntityオブジェクトを返します。

ResponseEntityから応答本文とhttpステータスの両方を取得したいと思います。

postHandleメソッド属性からResponseEntityにアクセスするにはどうすればよいですか?

public void postHandle(HttpServletRequest request, 
    HttpServletResponse response, 
    Object handler, 
    ModelAndView modelAndView) {}

modelAndView属性は、私の呼び出しではnullです。

ありがとう、ジェイソン

4

3 に答える 3

4

あなたが質問を書いた頃にはそれは不可能だったと思いますが、今はそうです。ドキュメントからhttp://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto

「HandlerInterceptorのpostHandleメソッドは、@ ResponseBodyメソッドとResponseEntityメソッドでの使用に必ずしも理想的に適しているとは限らないことに注意してください。このような場合、HttpMessageConverterは、postHandleが呼び出される前に応答を書き込んでコミットするため、応答を変更することはできません。代わりに、アプリケーションはResponseBodyAdviceを実装し、それを@ControllerAdvice Beanとして宣言するか、RequestMappingHandlerAdapterで直接構成することができます。

于 2016-07-20T11:34:19.367 に答える
3
@ControllerAdvice
public class ResponseDTOFilterAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(final MethodParameter returnType, final Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(final Object body, final MethodParameter returnType, final MediaType selectedContentType,
        final Class<? extends HttpMessageConverter<?>> selectedConverterType, final ServerHttpRequest request,
        final ServerHttpResponse response) {
        if (body instanceof ResponseDTO<?>) {
            ResponseDTO<?> responseDTO = (ResponseDTO<?>) body;
            responseDTO.setHostname(request.getLocalAddress().getHostName());
        }
        return body;
    }
}

出典:SpringMVCでのJson応答の後処理

于 2017-05-24T17:48:14.497 に答える
2

私は1つの完全な解決策と1つの部分的な解決策を見つけました。

部分的な解決策:サーブレット3.0を使用している場合は、HTTPStatusコードをHttpServletResponseオブジェクトで使用できます。これにより、ステータスコードを取得できるという点で問題の半分は解決しましたが、それでも、検査したいbody属性を持つResponseEntityにアクセスできませんでした。

完全なソリューション(サーブレット2.xで動作):アスペクトとインターセプターの組み合わせを使用しました。

アスペクトは、ResponseEntitiesを返すコントローラーのメソッドの@AfterReturnをターゲットにするようにコーディングされています。基本的に、返されたresponseEntityをキャプチャし、ThreadLocal<ResponseEntity>コレクションに配置します。

次に、インターセプターはアスペクトにスレッドの応答とアクセス可能なTA-DAHを要求しました。

この答えが他の誰かに役立つことを願っています。乾杯、ジェイソン

于 2012-04-19T22:02:40.390 に答える