使用AspectJ spring-aop [duplicate]更改返回值的类型

问题描述 投票:7回答:2

我想完成从控制器添加的JSON响应,例如状态属性。在这方面,我将使用Aspect类,其中@Around方法返回一个自定义类对象。在这种情况下,我收到一个错误:

java.lang.ClassCastException: *.controller.RestResponse cannot be cast to java.util.List

有没有办法通过aspectJ annotation @Around将@ResponseBody类型的返回更改为自定义类型?我无法更改控制器代码!

控制器类:

@Controller
@RequestMapping(value = "/users")
public class UserController {

@Autowired
private UserService userService;

@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public List<User> get() throws InterruptedException {
    return userService.getUsers();
}
...
}

Aspect类:

@Component
@Aspect
public class RestInterceptor {

@Pointcut("within(* controller.api.*)")
public void endpointMethod() {
}

@Around("endpointMethod()")
public RestResponse unifyResponse(ProceedingJoinPoint pjp) throws Throwable {
    Object controllerResult = pjp.proceed();
    RestResponse result = new RestResponse(0, controllerResult);
    return result;
}
}

自定义类RestResponse:

public class RestResponse{

private int status;
private String message;
private Object data;

public RestResponse(int status, Object data) {
    this.status = status;
    this.data = data;
}

public RestResponse(int status, String message) {
    this.status = status;
    this.message = message;
}
//getters and setters
}
java return aspectj spring-aop
2个回答
0
投票

我认为你的切点有一些问题。如果你只想在控制器类的get()方法周围切点,你应该使用这样的东西:

@Pointcut("execution(* package..Controller.get(..))")  .

在您的情况下,您可以通过调试流来检查您应用的切点是否正在执行Controller类的get()方法或包controller.api。*中的某些其他方法。

希望这能解决你的问题。


0
投票

请改用ResponseBodyAdvice。

© www.soinside.com 2019 - 2024. All rights reserved.