首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AspectJ spring-aop更改返回值的类型

使用AspectJ spring-aop更改返回值的类型
EN

Stack Overflow用户
提问于 2014-07-29 14:34:21
回答 2查看 9.1K关注 0票数 8

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

代码语言:javascript
复制
java.lang.ClassCastException: *.controller.RestResponse cannot be cast to java.util.List

有没有办法将@ResponseBody类型中的返回值通过aspectJ注释@Around更改为自定义类型?我不能更改控制器代码!

控制器类:

代码语言:javascript
复制
@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类:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
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
}
EN

回答 2

Stack Overflow用户

发布于 2018-10-24 20:08:30

请改用ResponseBodyAdvice。

票数 0
EN

Stack Overflow用户

发布于 2014-07-29 14:47:01

我认为你的point cut.If有一些问题,你只想绕过控制器类的get()方法,你应该使用这样的东西:

代码语言:javascript
复制
@Pointcut("execution(* package..Controller.get(..))")  .

在您的例子中,您可以通过调试流程来检查您应用的point cut是围绕Controller类的get()方法执行的,还是在Controler.api.*包中的其他方法执行的。

希望这能解决你的问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25009436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档