小编kri*_*aex的帖子

如何在Java中获取线程ID

我可以如下指定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)

java multithreading

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

使用AspectJ监视数据库访问方法

我想使用AspectJ来监视数据库语句.

当我将切入点定义为

@Pointcut("execution(* java.sql.*Statement.execute*(..))")
Run Code Online (Sandbox Code Playgroud)

这是行不通的.但是当我将切入点定义为

@Pointcut("execution(* *.*(..))")
Run Code Online (Sandbox Code Playgroud)

它可以监控所有方法.

如何定义切入点以仅监视数据库访问方法?

java sql aop monitoring aspectj

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

Spring Aop日志记录行号不正确

我正在使用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)

logging aop spring

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

Spring AOP 参数


我对 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方式回答。

java spring spring-aop

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

Spring AOP中如何拦截元注解(annotated annotations)

假设我想找到所有用@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间接注释的,有没有通用的方法来处理这种情况?

spring annotations aspectj spring-aop

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

在同一测试中使用 Geb &amp; Spock 重启浏览器

我希望能够使用 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)

selenium spock geb

0
推荐指数
1
解决办法
1414
查看次数