package jnpf.base.controller; import jnpf.base.model.flow.DataModel; import jnpf.base.model.uploadedit.UploadEditContext; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; /** 本次新增附件入口的失败诊断;重新抛出原异常,保留平台原错误响应。 */ @Slf4j @Aspect @Component public class UploadFileFailureLog { @Around("execution(public * jnpf.base.controller.UploadEditController.*(..)) || " + "execution(public * jnpf.base.controller.UploadEditInternalController.*(..)) || " + "execution(public * jnpf.base.controller.WorkflowFileAccessController.*(..)) || " + "execution(public * jnpf.base.service.UploadFilePermissionService.prepare(..)) || " + "execution(public * jnpf.base.service.UploadFilePermissionService.validate(..)) || " + "execution(public * jnpf.base.service.UploadEditDraftService.prepareSave(..))") public Object recordFailure(ProceedingJoinPoint call) throws Throwable { try { return call.proceed(); } catch (Exception error) { // 不输出请求参数、文件地址、正文或认证头;栈位置用于定位实际拒绝处。 StackTraceElement[] stack = error.getStackTrace(); String modelId = null; String recordId = null; for (Object argument : call.getArgs()) { if (argument instanceof DataModel) { modelId = ((DataModel) argument).getVisualId(); recordId = ((DataModel) argument).getMainId(); } else if (argument instanceof UploadEditContext) { modelId = ((UploadEditContext) argument).getModelId(); recordId = ((UploadEditContext) argument).getRecordId(); } } log.warn("Upload file request failed: endpoint={}, modelId={}, recordId={}, errorType={}, origin={}", call.getSignature().toShortString(), modelId, recordId, error.getClass().getSimpleName(), stack.length == 0 ? "unknown" : stack[0]); throw error; } } }