我可以如下指定log4j格式化程序来打印spring mvc应用程序中的当前线程id
log4j.appender.FILE.layout.ConversionPattern=%d{ISO8601} %p %t %c - %m%n
Run Code Online (Sandbox Code Playgroud)
如何在我的spring应用程序中以编程方式获取当前线程ID.更确切地说,我想在拦截控制器方法的方面获取当前线程id.我的方面如下:
@Configurable
@Aspect
public class TimingAspect {
@Autowired
private HttpServletRequest httpServletRequest;
//Generic performance logger for any mothod
private Object logPerfomanceInfo(ProceedingJoinPoint joinPoint) {
// do something with thread id
// do something with httprequest
...
}
// Performance info for API calls
@Around("execution(* package.controller.*.*(..))")
public Object logAroundApis(ProceedingJoinPoint joinPoint) throws Throwable {
return logPerfomanceInfo(joinPoint);
}
}
Run Code Online (Sandbox Code Playgroud) 我想使用AspectJ来监视数据库语句.
当我将切入点定义为
@Pointcut("execution(* java.sql.*Statement.execute*(..))")
Run Code Online (Sandbox Code Playgroud)
这是行不通的.但是当我将切入点定义为
@Pointcut("execution(* *.*(..))")
Run Code Online (Sandbox Code Playgroud)
它可以监控所有方法.
如何定义切入点以仅监视数据库访问方法?
我正在使用spring aop来为我的应用程序进行日志记录:我之前和之后都有配置的建议,但是我看到的行号不是目标类,而是用于记录的类的行如何解决这个问题下面是我的配置
Spring xml:
<aop:aspectj-autoproxy proxy-target-class="false" />
Run Code Online (Sandbox Code Playgroud)
用于记录的类:
package com.digilegal.services.ahc.logging;
import java.lang.reflect.Modifier;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
@Aspect
public class AHCLogging {
@Before("execution(* com.digilegal.services..*.*(..))")
public void logBefore(JoinPoint joinPoint) {
Logger log = Logger.getLogger(joinPoint.getTarget().getClass());
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
if (!Modifier.isPrivate(signature.getModifiers())
&& !signature.getName().startsWith("get")
&& !signature.getName().startsWith("set")
&& !signature.getName().startsWith("is")) {
log.trace("ENTER METHOD ::"
+ signature.getReturnType().getSimpleName() + " "
+ signature.getName() + "("
+ paramterType(signature.getParameterTypes()) + ")");
}
}
@After("execution(* com.digilegal.services..*.*(..))") …Run Code Online (Sandbox Code Playgroud)
我对 Spring AOP 有疑问。我想在切入点中获取 Student 对象。但我的 JoinPoints 可以以任何优先级拥有该对象。
查看下面的代码片段,了解我创建的两个不同的连接点和切入点:
public Student createStudent(String s, Student student) {...}
public Student updateStudent(Student student, String s) {...}
@Before("args(..,com.hadi.student.Student)")
public void myAdvice(JoinPoint jp) {
Student student = null;
for (Object o : jp.getArgs()) {
if (o instanceof Student) {
student = (Student) o;
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码仅适用于第一个 JoinPoint。所以问题是如何创建一个切入点,该切点将在输入参数中针对 Student 的任何情况执行。
我无法使用下面的代码,它抛出runtimeException:
@Before("args(..,com.hadi.student.Student,..)")
我让代码变得容易理解,实际上我的切入点比这个大得多。所以请用args方式回答。
假设我想找到所有用@Controller 注释的类,我会创建这个切入点:
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void controllerPointcut() {}
Run Code Online (Sandbox Code Playgroud)
但是找不到那些用@RestController 注释的控制器。因为 RestController 本身是用@Controller 注释的。
关于如何查找使用 @Controller 或 @RestController 注释的类而无需创建两个 Pointcuts 的任何想法?
======编辑====我在这里的真正意图如下:
父注释:
public @interface ParentAnnotation {}
Run Code Online (Sandbox Code Playgroud)
子注释(用@ParentAnnotation 注释):
@ParentAnnotation
public @interface ChildAnnotation {}
Run Code Online (Sandbox Code Playgroud)
A类:
@ParentAnnotation
public class MyClassA {}
Run Code Online (Sandbox Code Playgroud)
B类:
@ChildAnnotation
public class MyClassB {}
Run Code Online (Sandbox Code Playgroud)
现在我想通过@ParentAnnotation 找到MyClassA 和MyClassB。找到MyClassA是没有问题的,但是MyClassB是用@ParentAnnotation间接注释的,有没有通用的方法来处理这种情况?
我希望能够使用 Geb 和 Spock 框架重新启动我的浏览器会话中期测试。我不知道如何关闭浏览器并在测试完成等之后更新,但是当我在测试期间关闭并尝试重新使用浏览器对象时,我收到了 selenium 抛出的会话错误。以下是我正在尝试执行的基本大纲。NB 从不允许我导航到新的 StoreHome,如果我尝试只使用浏览器,我会抛出错误。
@Category(High.class)
def "TC1: Verify Browser Restart"() {
when: "On my StoreFront HP wait until title displayed"
to StoreHomePage
waitFor { homepagetitle.displayed }
then: "Update your site picker"
mySitePicker.click()
waitFor { myNewHomePageTitle.displayed }
when: "Close the browser and insure on restart new page is loaded"
browser.close()
browser.quit()
def nb = new Browser()
nb.to(NewStoreHomePage)
then: "Validate on New HP"
asset myNewHomePageTitle.displayed
}
Run Code Online (Sandbox Code Playgroud) java ×3
spring ×3
aop ×2
aspectj ×2
spring-aop ×2
annotations ×1
geb ×1
logging ×1
monitoring ×1
selenium ×1
spock ×1
sql ×1