た後、私はSpring MVCのアプリケーションで、以下のものを持っている:ログ応答ボディ非同期Spring MVCのコントローラメソッド
@RestController
public class SomeController {
@GetMapping(value = "/csv", produces = { "text/csv", MediaType.APPLICATION_JSON_VALUE })
public Future someAsyncMethod() {
return CompletableFuture
.supplyAsync(() -> generateCsvSlowly()))
.thenApply(csv -> {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Disposition", "attachment; filename=" + "Filename_.csv");
httpHeaders.add("Cookie", "fileDownload=true; path=/");
return new HttpEntity<>(csv, httpHeaders);
});
}
}
}
だから、単にので、ゆっくりと、私はこの呼び出しを非同期に行うために持っていることをcsvファイルを生成しますが。
私は次のようにすべてのレスポンスボディのログを記録しようとしている:ここで
@Component
public class LoggingFilter extends OncePerRequestFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class);
private static final AtomicLong ID = new AtomicLong();
static final String SOME_FORMAT_STRING = ...;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
long id = ID.incrementAndGet();
HttpServletResponse responseToUse = response;
if (!(response instanceof ContentCachingResponseWrapper)) {
responseToUse = new ContentCachingResponseWrapper(response);
}
try {
filterChain.doFilter(request, responseToUse);
}
finally {
byte[] responseBodyBytes = ((ContentCachingResponseWrapper) responseToUse).getContentAsByteArray();
LOGGER.info(SOME_FORMAT_STRING, id, responseToUse.getStatus(), responseToUse.getContentType(),
new ServletServerHttpResponse(responseToUse).getHeaders(), new String(bodyBytes, UTF_8));
((ContentCachingResponseWrapper) responseToUse).copyBodyToResponse();
}
}
}
は私の例外ハンドラです:
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(ApplicationException.class)
@ResponseBody
public ResponseEntity<Status> handleException(ApplicationException exception) {
Status status = new Status();
...
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
...
return new ResponseEntity(status, headers, exception.getHttpCodeMvc());
}
@Override
protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
return handleException(new ApplicationException(ex, ApplicationStatus.GENERIC_ERROR));
}
}
ここStatus
は、単純なPOJOで、ApplicationException
は、カスタム例外ですクラス。
generateSlowlyCsv
はそれがhandleException
で処理されますが、何ものが記録され、何のボディがクライアントに返されません取得していない例外がスローされます。他の非非同期コントローラメソッドはエラー(同じものでも)を記録し、応答本体を返します。 csvが生成されたとき(私はデバッガでそれを見た)エラーがなくなり、コールがハングアップし、どこからでも見つけられませんでした。 LoggingFilter
がなければ、すべてうまくいくが、もちろんログはない。
例外が発生したときに応答ボディを緩めて、生成時にcsvを返す方法はありますか?どうもありがとうございました!
P.S.私は次のようなもので終わっすぎ