Around Advice не работает, когда он зависит от ответа от другой службы REST - PullRequest
0 голосов
/ 26 мая 2020

Я работаю с Spring AOP, чтобы определить общий резервный метод вместо дублирования кода. Я использовал @Around, так как мне нужно вернуть объект из Aspect. Я пытаюсь решить совет @Around в зависимости от полученного ответа, но не могу этого сделать. Вот мой контроллер:

@RequestMapping(value = "/add/employee", method = RequestMethod.GET)
    public EmployeeResponse addEmployee(@RequestParam("name") String name, @RequestParam("empId") String empId) {
        EmployeeResponse employeeResponse=employeeService.createEmployee(name, empId);
        return employeeResponse;

    }

createEmployee в классе обслуживания используется для вызова другой конечной точки для вставки некоторых данных. Я хочу принять решение на основе ответа employeeResponse, но не могу это сделать. Я также пробовал @AfterReturning, но я не могу вернуть объект, если использую его.

Ниже мой класс аспекта:

@Around(value = "execution(* com.test.service.EmployeeService.*(..)) and args(name,empId)")
public Object getAllAdvice2(ProceedingJoinPoint pjp, String name,String empId) throws Throwable {
    System.out.println("Inside Aspect");
     Object[] arguments = pjp.getArgs();
    if (!checkForPath()) {
        return pjp.proceed();
    }
    System.out.println("Call Second path please!!");
    return arguments;
    }

    private boolean checkForPath() {
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
        .getResponse();
        return response.getStatus()==501?true:false;
    }
}

Я использовал HttpServletResponse и RequestContextHolder для получения контекста но, похоже, он будет использовать текущий контекст, то есть "/ add / employee". Как я могу вернуть фактический статус из checkForPath () (поскольку мне не нужно вызывать pjp.proceed для каждого возвращенного кода состояния), чтобы я мог выполнить строку System.out.println («Вызовите второй путь, пожалуйста !! "); в зависимости от моего кода ошибки.

Кто-нибудь может подсказать, где что-то не так?

1 Ответ

0 голосов
/ 27 мая 2020

Ваш код аспекта довольно хаотичный c и не имеет особого смысла:

  1. Вы пытаетесь проверить ответ перед вызовом proceed(), как сказал RG. Вместо этого используйте что-то вроде EmployeeResponse response = (EmployeeResponse) proceed(), проверьте ответ и затем решите, что делать дальше.
  2. Вы уже привязываете параметры метода к name и empId, нет необходимости использовать pjp.getArgs().
  3. return arguments не имеет смысла, потому что вы должны возвращать объект EmployeeResponse (либо исходный результат, либо другой), а не массив аргументов метода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...