我无法@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) 我正在使用Spring AOP和Log4J实现一个记录器作为一个方面,但我注意到日志文件中的LoggerAspect类名始终是类名,所以...有没有办法在我的日志中跟踪实际的类名?
我需要通过使用注释作为切入点来接受一些方法及其属性,但是如何访问这些方法属性.我有以下代码,可以在方法运行之前成功运行代码,但我只是不知道如何访问这些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) 线程"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) 我正在使用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线程是否安全?如果不是,那么在执行建议期间获得它的最佳方法是什么?它是否是线程安全的?如果可能的话我宁愿不使用本地线程.
我正在关注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) 我想为使用特定注释注释的私有方法创建一个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,则会触发我的方面.我应该如何定义切入点或配置我的方面以使我的原始用例工作?
我需要一些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) 在我的请求中,我有一个参数名称"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中获取此访问令牌.
提前致谢.
我创建了一个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)