4

JSON をクライアントに返すコントローラーがあります。コントローラーのメソッドは、次のような mvc アノテーションを使用してマークされます。

@RequestMapping("/delete.me")
public @ResponseBody Map<String, Object> delete(HttpServletRequest request, @RequestParam("ids[]") Integer[] ids) {

Jackson がクラスパス上にあり、クライアントが JSON 応答を要求しているため、Spring は JSON を返すことを認識しています。これらのリクエストと他のすべてのコントローラーの応答をログに記録したいと思います。過去に、これを行うためにインターセプターを使用しました。ただし、ModelAndView から応答本文を取得しました。@ResponseBody を使用している今、インターセプターで応答本文を取得するにはどうすればよいですか? 具体的には、このメソッドで応答本文を取得するにはどうすればよいですか?

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

1 に答える 1

5

CustomizableTraceInterceptor アプリケーションコンテキストのxml設定で設定し、AOPを使用してすべてをログに記録できます:(ログレベルのトレース)

    <bean id="customizableTraceInterceptor"  
        class="org.springframework.aop.interceptor.CustomizableTraceInterceptor">  
        <property name="exitMessage" value="Leaving $[methodName](): $[returnValue]" />  
    </bean>  

または、Javaで実装して完全にカスタマイズし、メソッドsetExitMessage()を使用することもできます。

public class TraceInterceptor extends CustomizableTraceInterceptor {

    private Logger log = LoggerFactory.getLogger("blabla");

    @Override
    protected void writeToLog(Log logger, String message, Throwable ex) {
        //Write debug info when exception is thrown
        if (ex != null) {
            log.debug(message, ex);
        }
          ....
    }

    @Override
    protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) {
        return true;
    }

    @Override
    public void setExitMessage(String exitMessage) {
            .... //Use PlaceHolders
    }
}

'$[returnValue]'などのプレースホルダーを使用します。完全なリストは、SpringAPIのドキュメントにあります。

編集:また、別のインターセプターで@ResponseBodyの値を取得したい場合は、バージョン>3.1.1までは不可能だと思います。この問題を確認してください:https ://jira.springsource.org/browse/SPR-9226

于 2013-01-30T16:25:39.563 に答える