gpt4 book ai didi

Java - 如何结合 Validation 和 AOP 注释并在 Spring Controller 中使用它?

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:56 25 4
gpt4 key购买 nike

目前我们正在将一个 Struts 1.1 项目迁移到 Spring 4.x。

我们已经成功地将 Action 类转换为 Controller 并将 formbean 转换为 Model,甚至我们能够将 struts 验证转换为 Spring 验证。

但是当我们尝试为所有 Controller 添加 AOP 时,我们遇到了一个问题。目的是添加一个日志来测量所有 Controller 方法所花费的时间。

下面是代码片段,

@Component
@Controller
public class LoginController {

@Autowired
private LoginValidator loginValidator;

@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(loginValidator);
}

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String loginUser(@Valid @ModelAttribute Login form, BindingResult bindingResult) {
System.out.println("Entering loginController.loginUser method");
}
}

我们使用下面的切点来应用 aop,

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class Logging {

@Pointcut("execution(* com.controller.*.*(..))")
public void businessLogicMethods() {}

@Around("businessLogicMethods()")
public Object logAround(ProceedingJoinPoint jp) {

System.out.println("around() is running!");
System.out.println(jp.getSignature().getName());
System.out.println(jp.getArgs());
Object obj = null;
try {
obj = jp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("******");
return obj;
}
}

验证或 AOP 同时工作。如果未应用 AOP,则会触发验证。如果应用 aop,则仅触发 AOP。

有人可以帮忙吗?

谢谢...

最佳答案

我得到了这个工作。您必须进行 2 次更改。

更改编号:1

  1. 由于某种原因,您的方面定义是错误的。(不知道为什么)。但以下方面将起作用。

    @Component
    @Aspect
    public class Logging {

    static final Logger LOG = LoggerFactory.getLogger(Logging.class);

    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void controller() {}

    @Pointcut("execution(* *(..))")
    public void methodPointcut() {}

    @Pointcut("within(@org.springframework.web.bind.annotation.RequestMapping *)")
    public void requestMapping() {}

    @Before("controller() && methodPointcut() && requestMapping()")
    public void aroundControllerMethod(JoinPoint joinPoint) throws Throwable {
    LOG.info("Invoked: " + niceName(joinPoint));
    }

    @AfterReturning("controller() && methodPointcut() && requestMapping()")
    public void afterControllerMethod(JoinPoint joinPoint) {
    LOG.info("Finished: " + niceName(joinPoint));
    }

    private String niceName(JoinPoint joinPoint) {
    return joinPoint.getTarget().getClass()
    + "#" + joinPoint.getSignature().getName()
    + "\n\targs:" + Arrays.toString(joinPoint.getArgs());
    }

    }

第 2 次变更

initBinder 应该声明为公共(public)的。目前您已将此方法定义为private。我再次不确定为什么在没有方面的情况下它能正常工作。

   @InitBinder
public void initBinder(WebDataBinder binder) {
binder.setValidator(loginValidator);
}

这 2 个更改将起作用。

关于Java - 如何结合 Validation 和 AOP 注释并在 Spring Controller 中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29340256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com