标签: spring-aop

自动连接的依赖项未在Spring MVC中的Aspect中注入

我无法@Autowire在Aspect中使用服务层实例.在Aspect中,对@Autowiredbean 的引用是NULL并且它会抛出NullPointerException.任何帮助都感激不尽.我想,我搞砸了配置.

以下是我的servlet-context.xml:

<!-- Activates various annotations to be detected in bean classes -->
<context:annotation-config />
<context:spring-configured />       

<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="xx.yy" />

<!--  an @AspectJ aspect will be interpreted as an aspect by Spring AOP and beans in the context will be advised accordingly -->
<aop:aspectj-autoproxy />

<beans:bean id="loggingAspect" class="xx.yy.aop.aspects.LoggingAspect" />
<beans:bean id="authenticationAspect" class="xx.yy.aop.aspects.AuthenticationAspect" />

<!-- Enables the Spring …
Run Code Online (Sandbox Code Playgroud)

aop aspectj spring-mvc spring-aop

10
推荐指数
1
解决办法
8974
查看次数

Log4j和AOP,如何获取实际的类名

我正在使用Spring AOP和Log4J实现一个记录器作为一个方面,但我注意到日志文件中的LoggerAspect类名始终是类名,所以...有没有办法在我的日志中跟踪实际的类名?

java spring log4j spring-aop

10
推荐指数
2
解决办法
9451
查看次数

如何使用Spring AOP(AspectJ样式)访问方法属性?

我需要通过使用注释作为切入点来接受一些方法及其属性,但是如何访问这些方法属性.我有以下代码,可以在方法运行之前成功运行代码,但我只是不知道如何访问这些attrbiutes.

package my.package;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyAspect {

 @Pointcut(value="execution(public * *(..))")
 public void anyPublicMethod() {
 }

 @Around("anyPublicMethod() && @annotation(myAnnotation )")
 public Object myAspect(ProceedingJoinPoint pjp, MyAnnotation myAnnotation)
    throws Throwable {

  // how can I access method attributes here ?
  System.out.println("hello aspect!");
  return pjp.proceed();
 }
}
Run Code Online (Sandbox Code Playgroud)

java aop aspectj spring-aop

9
推荐指数
2
解决办法
2万
查看次数

Spring AOP切入点不是很好

线程"main"中的异常org.springframework.beans.factory.BeanCreationException:创建名为'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0'的bean时出错:bean的实例化失败; 嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.aop.aspectj.AspectJPointcutAdvisor]:构造函数抛出异常; 嵌套异常是java.lang.IllegalArgumentException:切入点格式不正确:期望在名称位置49执行'name pattern'(*com.idol.performers.Performer.perform(..)

我的切入点有什么问题?在书中它说

(..) // means taking any arguments
Run Code Online (Sandbox Code Playgroud)

我的xml:

 ...
<aop:before pointcut="execution(*com.idol.performers.Performer.perform(..))" method="takeSeats"/>
 ...
Run Code Online (Sandbox Code Playgroud)

aop spring spring-aop pointcut

9
推荐指数
1
解决办法
1万
查看次数

用于自动装配的HTTPServletRequest bean的Spring AOP和方面线程安全性

我正在使用Spring 3 AOP,我有一个需要访问HttpServletRequest的方面.它看起来像这样:

@Aspect
public class MyAspect {

    @Autowired
    private HttpServletRequest httpServletRequest;

    public void init() {
        // Do something once...
    }

    @Before("my pointcut here...")
    private void myMethod() {
        // I need the httpServletRequest...
    }

    @After("my pointcut here...")
    private void myOtherMethod() {
        // I need the httpServletRequest...
    }
}
Run Code Online (Sandbox Code Playgroud)

并配置如下:

<bean id="myAspect" class="com.some.package.MyAspect" init-method="init" />
Run Code Online (Sandbox Code Playgroud)

init方法是否每个IoC容器只调用一次,即使这是一个方面,httpServletRequest线程是否安全?如果不是,那么在执行建议期间获得它的最佳方法是什么?它是否是线程安全的?如果可能的话我宁愿不使用本地线程.

aop spring servlets thread-safety spring-aop

9
推荐指数
1
解决办法
4147
查看次数

在关注Spring Aspect Programming的JavaBrains教程时,我遇到以下异常:

我正在关注Javabrains的spring方面编程教程.我特意在本教程中:http://javabrains.koushik.org/2011/08/spring-tutorial-27-writing-our-first.html我将所需的库导入到项目中,我没有得到任何警告IDE,但是当我运行代码时,我得到以下异常:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'triangle' defined in class path resource [spring.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutDesignatorHandler
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at org.koushik.javabrains.AopMain.main(AopMain.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutDesignatorHandler
at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getPointcut(ReflectiveAspectJAdvisorFactory.java:145)
at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvisor(ReflectiveAspectJAdvisorFactory.java:130)
at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory$1.doWith(ReflectiveAspectJAdvisorFactory.java:74)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:473)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:451) …
Run Code Online (Sandbox Code Playgroud)

java exception spring-aop

9
推荐指数
2
解决办法
1万
查看次数

AspectJ切入点用于带注释的PRIVATE方法

我想为使用特定注释注释的私有方法创建一个Pointcut.但是,当注释位于如下所示的私有方法时,不会触发我的方面.

@Aspect
public class ServiceValidatorAspect {
    @Pointcut("within(@com.example.ValidatorMethod *)")
    public void methodsAnnotatedWithValidated() {
}

@AfterReturning(
            pointcut = "methodsAnnotatedWithValidated()",
            returning = "result")
    public void throwExceptionIfErrorExists(JoinPoint joinPoint, Object result) {
         ...
}
Run Code Online (Sandbox Code Playgroud)

服务接口

public interface UserService {

    UserDto createUser(UserDto userDto);
}
Run Code Online (Sandbox Code Playgroud)

服务实施

    public class UserServiceImpl implements UserService {

       public UserDto createUser(UserDto userDto) {

             validateUser(userDto);

             userDao.create(userDto);
       }

       @ValidatorMethod
       private validateUser(UserDto userDto) {

            // code here
       }
Run Code Online (Sandbox Code Playgroud)

但是,如果我将注释移动到公共接口方法实现createUser,则会触发我的方面.我应该如何定义切入点或配置我的方面以使我的原始用例工作?

aop spring aspectj spring-aop

9
推荐指数
1
解决办法
2万
查看次数

服务层的Spring AOP

我需要一些Spring AOP的帮助.我有以下代码:


@Service
public class UserSecurityService implements UserDetailsService {

    @Autowired
    private UserService userService;
    ....
}
Run Code Online (Sandbox Code Playgroud)
@Service
public class UserService extends CrudService<User, UserRepository> {

    public UserService() {
        super();
    }

    @Autowired
    public UserService(UserRepository repository) {
        super(repository);
        this.repository = repository;
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)
@Repository
interface UserRepository extends JpaRepository<User, String> {
     ...
}
Run Code Online (Sandbox Code Playgroud)

应用程序的context.xml

<import resource="classpath*:spring/application-context-db.xml" />
<import resource="classpath*:spring/application-context-aop.xml" />
<import resource="classpath*:spring/application-context-mail.xml" />
<import resource="application-context-security.xml" />

<context:component-scan base-package="com.xpto">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
</context:component-scan>
Run Code Online (Sandbox Code Playgroud)

应用程序上下文aop.xml文件

<aop:aspectj-autoproxy />
<aop:config>
    <aop:aspect id="serviceLoggingAspect" ref="serviceLoggingAspectBean"> …
Run Code Online (Sandbox Code Playgroud)

java proxy aop spring-mvc spring-aop

9
推荐指数
1
解决办法
1万
查看次数

从ProceedingJoinPoint中检索参数值

在我的请求中,我有一个参数名称"accessToken",如何从ProceedingJoinPoint获取请求参数值?

public Object handleAccessToken(ProceedingJoinPoint joinPoint) throws Throwable { 
    final Signature signature = joinPoint.getStaticPart().getSignature();
    if (signature instanceof MethodSignature) {
        final MethodSignature ms = (MethodSignature) signature;
        String[] params = ms.getParameterNames();
        for (String param : params) {
            System.out.println(param);
            // here how do i get parameter value using param ?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通话方式:

public MyResponse saveUser(
    @RequestParam("accessToken") String accessToken,
    @RequestBody final UserDto userDto
) {
    // code 
}
Run Code Online (Sandbox Code Playgroud)

我想在AOP中获取此访问令牌.

提前致谢.

aop spring-aop spring-aspects

9
推荐指数
2
解决办法
2万
查看次数

Spring 4 AOP @Aspect没有触发@RestController

我创建了一个Aspect,它执行基本的id比较,以确保用户属于创建所请求实体的同一组.我已成功将我的方面附加到@Service方法,但它在服务层上没有意义,我需要将它附加到@RestController方法.当我尝试这样做时,一切似乎都很好,但我的Aspect从未触发,日志也是静默的.

的pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.1.7.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

春天的背景

<context:annotation-config/>
<context:component-scan base-package="my.pkg"/>
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true"/>
Run Code Online (Sandbox Code Playgroud)

方面

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

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

    @Pointcut("args(java.security.Principal,..)")
    public void principalArgPointcut() {}

    @Around("(controller() || restController()) && principalArgPointcut()")
    public Object validate(ProceedingJoinPoint point) throws Throwable {
        doValidationBefore();
        Object result = point.proceed();
        doValidationAfter();

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

其中"doValidationBefore()"和"doValidationAfter()"将在验证失败时抛出异常.

最后,我的RestController

@RestController
@RequestMapping("/my-path")
public class MyController {
    @RequestMapping(value = "/{entityId}", method = RequestMethod.GET)
    public @ResponseBody
    ResponseEntity<MyEntity> getEntityDetails(Principal principal, @PathVariable("entityId") …
Run Code Online (Sandbox Code Playgroud)

spring-mvc spring-aop spring-4 spring-restcontroller

9
推荐指数
1
解决办法
6340
查看次数