小编mog*_*lol的帖子

@Aspect方面的Spring autowired bean为null

我有以下弹簧配置:

<context:component-scan base-package="uk.co.mysite.googlecontactsync.aop"/>

<bean name="simpleEmailSender" class="uk.co.mysite.util.email.simple.SimpleEmailSenderImplementation"/>

<aop:aspectj-autoproxy/>
Run Code Online (Sandbox Code Playgroud)

然后我有一个方面:

@Aspect
public class SyncLoggingAspect {
    @Autowired
    private SimpleEmailSender simpleEmailSender

    @AfterReturning(value="execution(* uk.co.mysite.datasync.polling.Poller+.doPoll())", returning="pusher")
    public void afterPoll(Pusher pusher) {      
        simpleEmailSender.send(new PusherEmail(pusher));
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方面有效(我可以在afterPoll上找到断点)但simpleEmailSender为null.不幸的是,我找不到明确的文件说明原因.(为了记录,我的simpleEmailSender bean存在并正确连接到其他类)以下事情使我感到困惑:

  1. 上下文:组件扫描应该是@Aspect?如果它肯定是一个弹簧管理bean,那么自动装配应该工作吗?
  2. 如果context:component-scan不是用于创建方面,那么我的方面是如何创建的?我认为aop:aspectj-autoproxy只是创建一个beanPostProcessor来代理我的@Aspect类?如果它不是一个Spring托管bean,它会如何做到这一点?

显然你可以告诉我,我不了解事情应该如何从头开始.

java aop spring aspectj spring-aop

34
推荐指数
4
解决办法
3万
查看次数

注释参数的Spring AOP切入点

说我有这样的方法:

public void method(@CustomAnnotation("value") String argument)
Run Code Online (Sandbox Code Playgroud)

是否有切入点表达式可以选择带有@CustomAnnotation注释的参数的所有方法?如果是这样,我可以获得访问的方式去"价值"参数?

aop spring spring-aop pointcut

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

我如何单元测试这个inputStream已经关闭?

我有一个Runnable方面:

    public void run() {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            //more stuff here
        } 
        catch (Exception e) {
            //simplified for reading
        }
        finally {
            if(inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {}
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如何inputStream.close()调用我的测试?我目前正在使用Mockito和JUnit.我知道注入inputStreamin是一个想法,但我不希望在run?()调用之前使用资源,因此它是一个局部变量.那么如何以允许我测试close是否被调用的方式重新设计我的代码?

java junit unit-testing mockito

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

Spring AOP:对任何名为x的方法的注释不起作用

我是第一次开始使用AOP.

我的第一个方面如下:

@Aspect
public class SyncLoggingAspect {
    private final Logger logger = Logger.getLogger(this.getClass());

    @Before("execution(public * *(..))")
    public void anyPublic() {
        System.out.println("HIT POINTCUT");
    }
}
Run Code Online (Sandbox Code Playgroud)

这成功地继续在任何公共方法调用上调用.但是,当我将其更改为:

@Before("execution(public * doPoll(..))")
public void anyPublic() {
    System.out.println("HIT POINTCUT");
}
Run Code Online (Sandbox Code Playgroud)

我希望它可以在任何名为"doPoll"的公共方法上工作,但是当这样的方法被称为没有任何反应时:

public class GmailContactPoller extends ContactPoller<GoogleUser, ContactPusher<GoogleUser>> {
    Logger logger = Logger.getLogger(this.getClass());

    @Override
    public List<? extends ContactPusher<GoogleUser>> doPoll() throws PollException {
           ...
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有EL语法中缺少的东西?或者这与继承层次结构有关?doPoll的超类方法在名为Poller的抽象类中是抽象的.没有接口会导致问题吗?

编辑:我刚注意到我的IDE启用了弹簧方面工具,现在我通过该方法发出以下编译器警告:

"尚未应用datasync.aop.aspects.SyncLoggingAspect中定义的描述资源路径位置类型建议[Xlint:adviceDidNotMatch] SyncLoggingAspect.java/DataSync/src/main/datasync/aop/aspects"

aop spring spring-aop

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

启用S​​pring AOP或AspectJ

这是从这个问题继续:

@Aspect方面的Spring autowired bean为null

我最初的理解是,当使用Spring AOP时,使用@Aspect注释的类被创建为spring managed beans,因此依赖注入将正常工作.但是,似乎带有@Aspect注释的对象被创建为弹簧容器外的单例,因此我必须像XML一样配置它,以便将其作为spring托管bean启用:

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" />
Run Code Online (Sandbox Code Playgroud)

这已经让我完全糊涂了.我认为以下配置将使用spring AOP:

<context:component-scan base-package="com.mysite.aspectPackage"/>
<aop:aspectj-autoproxy/>
Run Code Online (Sandbox Code Playgroud)

因此,它将使用组件扫描创建方面bean来扫描@Aspect注释,然后autoproxy将创建一个beanPostProcessor,它使用适当的建议代理我的上下文中的所有bean.然后我想要启用aspectJ我需要一个完全不同的XML配置(顺便说一下,我似乎无法在文档中找到一个例子).正是这种配置使用aspectJ来创建可以在我的容器之外的方面,或者通过操作字节码而不是代理来工作.

注意
这不是关于spring AOP和J方面之间差异的问题,这里有很好的阐述:

Spring AOP vs AspectJ

java aop spring spring-aop

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

Hibernate - 用于从Unidirectional OneToMany关系中获取集合的HQL

我有一个具有单向一对多关系的类,如下所示:

public class Order {
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name="order_item", joinColumns={@JoinColumn(name="order_id")}, inverseJoinColumns={@JoinColumn(name="item_id")})
    public Set<Item> getItems() {
        return items;
    }
} 
Run Code Online (Sandbox Code Playgroud)

通常获取此订单的内容很简单:

List<Item> items = order.getItems();
Run Code Online (Sandbox Code Playgroud)

但无论出于何种原因,我可能希望以某种方式过滤我的结果,并以最快的方式检索项目集合的一部分,例如超过特定价格的所有项目,低于特定股票等(不返回然后全部过滤然后).为此,我将运行HQL查询来检索特定订单的项目,并将更多内容添加到我的where子句或我的查询对象中.

直觉我会想要这种行为(这是完全错误的):

SELECT jointable.ITEM from order_item as jointable inner join jointable.order where order = :order
Run Code Online (Sandbox Code Playgroud)

但当然这是错误的,因为HQL在映射实体方面起作用,所以我不能在查询中使用连接表.那么这样做的正确方法是什么?

编辑:

我找到了这个问题的答案,我想要以下查询:

Select o.items from Order o where o = ?
Run Code Online (Sandbox Code Playgroud)

这允许我获取订单的项目集合,而不必使用双向关系.我现在对这个问题的第二阶段感到困惑,这是如何过滤这个集合的结果,最简单的例子是:

Select o.items from Order o where o = ? order by o.items.somenumberfield asc
Run Code Online (Sandbox Code Playgroud)

哪个返回非法尝试取消引用收集,那么我将如何过滤我的项目?

编辑:

票证解决方案实际上是正确的,我最初误解了解决方案.

java hibernate hql

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

Spring中的Thread.setDefaultUncaughtExceptionHandler

我正在开发一个Spring应用程序,并且想知道是否有一部分框架允许我以更优雅的方式执行此类操作,例如在XML中配置某些内容?

java spring uncaughtexceptionhandler

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

关系所有者在Hibernate中意味着什么?

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
}       
Run Code Online (Sandbox Code Playgroud)

我正在努力解决这方面的问题:

Troop has a bidirectional one to many relationship with Soldier through the troop property. You don't have to (must not) define any physical mapping in the mappedBy side.
Run Code Online (Sandbox Code Playgroud)

例如,以下代码:

Troup t = new Troup();
t.getSoldiers().add(soldier);
Run Code Online (Sandbox Code Playgroud)

如果我刚刚打电话session.saveOrUpdate(t),如果我刚刚打电话, 会有什么不同session.saveOrUpdate(s)?MappedBy将troup定义为所有者,但这具体意味着什么?因为我希望如果我保存士兵对象,肯定会保存troop_fk列吗?如果我只保存troup对象,那么当级联时,士兵外键肯定会正确更新吗?我真的看不出差异.

hibernate hibernate-mapping

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

Hibernate - 我可以混合命名和位置参数吗?

我有一个queryString的行:

session.createSQLQuery("SELECT C.FIRSTNAME AS firstName, C.LASTNAME as lastName FROM ADDRESSBOOK_CONTACT AS C WHERE C.ADDRESSBOOK_ID = :addressbookId AND firstName = ?");
Run Code Online (Sandbox Code Playgroud)

设置我的位置参数时,查询正常运行,但没有结果:

query.setParameter(0, "firstname1010");
query.setParameter("addressbookId", addressbook.getId());
Run Code Online (Sandbox Code Playgroud)

哪个错了.如果我将我的位置改为命名:

query.setParameter(firstname, "firstname1010");
Run Code Online (Sandbox Code Playgroud)

然后我的查询返回正确的结果.

我没有对我为什么这样做进行复杂的解释,我想知道是否应该支持两种类型的混合?我正在使用hibernate 3.6.3.Final

java sql hibernate

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

当我缓存构建目录时,为什么 Gradle 会在 GitLab CI 上重新运行最新的测试?

我有以下多项目 gradle 文件的构建配置:

stages:
  - test

before_script:
  - export GRADLE_USER_HOME=`pwd`/.gradle

cache:
  paths:
    - .gradle/wrapper
    - .gradle/caches
    - build

test :
  dependencies: []
  image: openjdk:x
  stage: test
  script:
      - ./gradlew test --debug
Run Code Online (Sandbox Code Playgroud)

在 GitLab 上,在不更改源文件的构建之间,我得到:

Up-to-date check for task ':x:compileJava' took 1.117 secs. It is not up-to-date because:
No history is available.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它这么说,因为我希望任务历史记录能够从缓存中恢复。我在运行之间的日志中看到这一点:

Creating cache default...
.gradle/wrapper: found 207 matching files          
.gradle/caches: found 5058 matching files          
build: found 2743 matching files
Run Code Online (Sandbox Code Playgroud)

当我在本地计算机上重新运行时,我可以看到测试没有重新运行:

> Skipping task ':x:compileJava' as it is up-to-date (took …
Run Code Online (Sandbox Code Playgroud)

gradle gitlab gitlab-ci-runner

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