微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java – 如何组合验证和AOP注释并在Spring Controller中使用它?

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

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

但是当我们尝试为所有控制器添加AOP时,我们遇到了一个问题.
目的是添加一个日志来测量所有控制器方法所需的时间.

下面是代码片段,

@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

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

@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.目前,您已将此方法定义为私有.我再次不确定为什么没有这些方面,这项工作是正确的.

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

这两个变化将起作用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐