【问题标题】:When use @Around aspect then RestController return empty response当使用 @Around 方面时 RestController 返回空响应
【发布时间】:2021-06-24 20:12:08
【问题描述】:

我有简单的休息控制器:

    @RestController
    @RequestMapping(value = "/api/admin/operations")
    public class OperationController
    {
    
   @GetMapping("/get")
    public ResponseEntity<String> testGet(){
        //return new ResponseEntity(new BaseResponse<String>(200,"Succes","I am Data"), HttpStatus.OK);
        return new ResponseEntity<String>("Hello", HttpStatus.OK);

    }

我也有这个控制器的@Aspect:

@Aspect
@Configuration
public class UserActivityLogAspect
{

    @Autowired
    UserAuthorizationServiceImpl userAuthService;

    @Resource
    LoggingService loggingService;

    private static final org.apache.logging.log4j.Logger logger = LogManager.getLogger(UserActivityLogAspect.class);


    @Around("com.project.dsps.core.service.impl.common.aspect.CommonJoinPointConfig.operationControllerMethods()")
    public void aroundOperationUpdates(ProceedingJoinPoint joinPoint)
    {
        Signature signature = joinPoint.getSignature();
        Object[] args = joinPoint.getArgs();
        OperationDTO operationDTO = null;
        UserActivityLogDto activityLogDto = new UserActivityLogDto();
        UserInfo userAuthData = new UserInfo();
        List<String> methodArgsStr = new ArrayList<>();
        Map<String, Object> methodArgsMap = new HashMap<>();
        RetryMicroOperationDTO retryMicroOperationDTO = null;
        String userRemoteAdd = "";
        StringBuilder httpRequestUri = new StringBuilder("");
        HttpServletRequest httpServletRequest = null;


        try
        {
            Object returnValue = joinPoint.proceed();
        }

        catch (Exception e)
        {
            e.printStackTrace();
            loggingService.userLog(this.getClass().getSuperclass().getSimpleName() + "." +
                                   signature.toShortString().replaceAll("\\((.+?)\\)", "") + "." + e.getMessage(),
                                   activityLogDto);
        }
        catch (Throwable throwable)
        {
            throwable.printStackTrace();
        }


        try
        {

            for (int i = 0; i < args.length; i++)
            {
                if (args[i] instanceof OperationDTO)
                {
                    operationDTO = (OperationDTO) args[i];
                }
                if (args[i] instanceof String)
                {
                    methodArgsStr.add((String) args[i]);
                }
                if (args[i] instanceof Map)
                {
                    methodArgsMap = (Map<String, Object>) args[i];
                }
                if (args[i] instanceof RetryMicroOperationDTO)
                {
                    retryMicroOperationDTO = (RetryMicroOperationDTO) args[i];
                }
                if (args[i] instanceof HttpServletRequest)
                {
                    httpServletRequest = (HttpServletRequest) args[i];
                    userRemoteAdd = httpServletRequest.getRemoteAddr();
                    httpRequestUri.append(httpServletRequest.getRequestURI().substring(0, 22));
                    httpRequestUri.append(signature.getName().toString());
                }
            }
            userAuthData.setAuthorizationToken((String) methodArgsMap.get("authorization"));
            userAuthData.setRemoteAddr(userRemoteAdd);
            activityLogDto.setUserInfo(userAuthData);

            methodArgsMap.put("path", httpRequestUri.toString());
            if (httpServletRequest != null)
            {
                methodArgsMap.put("full-uri", httpServletRequest.getRequestURI());
            }
            if (operationDTO != null)
            {
                ObjectMapper mapper = new ObjectMapper();
                JsonNode jsonNode = mapper.valueToTree(operationDTO);
                methodArgsMap.put(operationDTO.getClass().getSimpleName(), jsonNode);
            }
            if (retryMicroOperationDTO != null)
            {
                ObjectMapper mapper = new ObjectMapper();
                JsonNode jsonNode = mapper.valueToTree(retryMicroOperationDTO);
                methodArgsMap.put(retryMicroOperationDTO.getClass().getSimpleName(), jsonNode);
            }

            activityLogDto.setReqData(methodArgsMap);

            try
            {
                userAuthData = userAuthService.getUserAuthorization((String) methodArgsMap.get("authorization"));
                userAuthData.setAuthorizationToken((String) methodArgsMap.get("authorization"));
                userAuthData.setRemoteAddr(userRemoteAdd);
                activityLogDto.setUserInfo(userAuthData);

                loggingService.userLog(this.getClass().getSuperclass().getSimpleName() + "." +
                                       signature.toShortString().replaceAll("\\((.+?)\\)", ""), activityLogDto);
            }
            catch (UnauthorizedException e)
            {

            }
            catch (Exception e)
            {

            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

当我在 Postman 中调用这个 REST API 时:

http://localhost:10001/api/admin/operations/get

我在方法响应中没有得到任何响应或错误,

但是当我在 UserActivityLogAspect 中评论 @Around 注释时,我得到了响应。 我还想补充一点,我调试任何异常或错误的方法执行,我没有发现任何东西和方面方法正常工作。

【问题讨论】:

    标签: java spring-mvc spring-aop


    【解决方案1】:

    您应该从@Around 建议中返回结果。

        @Around("com.project.dsps.core.service.impl.common.aspect.CommonJoinPointConfig.operationControllerMethods()")
        public Object aroundOperationUpdates(ProceedingJoinPoint point) throws Throwable {
        // before method execution
        var result = point.proceed();
        // after method execution
        return result;
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多