首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AspectJ处理通用结果?

如何使用AspectJ处理通用结果?
EN

Stack Overflow用户
提问于 2013-02-27 11:04:08
回答 1查看 784关注 0票数 0

我有一个方面(用aspectj语法public aspect ....编写),它操作许多返回Collection的方法的结果,以便对结果进行分页。

我不能(或者我不知道如何)在建议中使用泛型,所以无论我在哪里调用建议的方法,我都会得到警告

unchecked conversion when advice applied at shadow method-call(java.util.Collection ...), expected java.util.Collection<T> but advice uses java.util.Collection [Xlint:uncheckedAdviceConversion]

我怎么才能摆脱这个?

斯特凡诺

-添加方面代码摘录

代码语言:javascript
复制
public aspect PaginationSupportAspect extends ServiceSupportAspect {

    private static final Logger log = LoggerFactory.getLogger(PaginationSupportAspect.class);

    private pointcut paginate(Criteria criteria) : call(Collection org.jcz.persistence.Service+.*(Criteria));

    @SuppressWarnings({ "unchecked", "rawtypes" })
    Collection around(Criteria criteria, Service service) : paginate(criteria) && target(service) {
        log.trace(String.format("Executing <%s> @ <%s>", this.getClass(), thisJoinPoint.toLongString()));

        return doPaginate(proceed(criteria, service), criteria.getPagination(), service);
    }

    /**
     * 
     * @param source
     * @param criteria
     * @return
     */
    private <T extends EntitySupport> Collection<T> doPaginate(Collection<T> source, Pagination pagination, Service<T> service) {
        // IMPLEMENTATION OMITTED BECAUSE IT'S QUITE LONG

        // What it does is to create another Collection<T> that holds the pagination coordinates (page number, size, count) 
        // and only the elements of the requested page
    }

}

使用实例

代码语言:javascript
复制
Collection<MyEntity> entities = myEntityService.findAll(criteria);

这就是我得到警告的地方

EN

回答 1

Stack Overflow用户

发布于 2013-03-16 11:48:58

坏消息是:我不知道如何避免这种警告,因为我不太精通Java泛型,特别是不熟悉AspectJ,因为并不是所有您可能期望的都是语法允许的,例如将target()绑定到参数化类型(因为类型擦除限制)。

您可能与这一个邮件列表中的AspectJ有相同的问题。

好消息是:我终于用一个最少的代码示例来重现您的问题,使用了许多虚拟类,并对您如何在应用程序中使用它们做了一些有根据的猜测:

虚拟/助手类/方面:

代码语言:javascript
复制
package org.jcz.persistence;
public class EntitySupport {}
代码语言:javascript
复制
package org.jcz.persistence;
public class MyEntity {}
代码语言:javascript
复制
package org.jcz.persistence;
public class Pagination {}
代码语言:javascript
复制
package org.jcz.persistence;

public class Criteria {
    public Pagination getPagination() {
        return new Pagination();
    }
}
代码语言:javascript
复制
package org.jcz.persistence;

import java.util.ArrayList;
import java.util.Collection;

public class Service<T> {
    public Collection<T> findAll(Criteria criteria) {
        return new ArrayList<T>();
    }
}
代码语言:javascript
复制
package org.jcz.persistence;
public abstract aspect ServiceSupportAspect {}

您的方面,略有改变:

代码语言:javascript
复制
package org.jcz.persistence;

import java.util.ArrayList;
import java.util.Collection;

import org.apache.log4j.Logger;

public aspect PaginationSupportAspect extends ServiceSupportAspect {
    private static final Logger log = Logger.getLogger(PaginationSupportAspect.class);

    private pointcut paginate(Criteria criteria) :
        call(Collection org.jcz.persistence.Service+.*(Criteria)) && args(criteria);

    @SuppressWarnings({ "unchecked", "rawtypes" })
    Collection around(Criteria criteria, Service service) : paginate(criteria) && target(service) {
        log.trace(String.format("Executing <%s> @ <%s>", this.getClass(), thisJoinPoint.toLongString()));
        return doPaginate(proceed(criteria, service), criteria.getPagination(), service);
    }

    private <T extends EntitySupport> Collection<T> doPaginate(
            Collection<T> source, Pagination pagination, Service<T> service)
    {
        System.out.println("doPaginate");
        return new ArrayList<T>();
    }
}

,现在是一个小型驱动程序,用于复制Xlint警告:

代码语言:javascript
复制
import java.util.Collection;

import org.jcz.persistence.Criteria;
import org.jcz.persistence.MyEntity;
import org.jcz.persistence.Service;

public class Application {
    public static void main(String[] args) {
        Service<MyEntity> myEntityService = new Service<MyEntity>();
        Criteria criteria = new Criteria();
        Collection<MyEntity> entities = myEntityService.findAll(criteria);
        System.out.println("Found entities: " + entities);
    }
}

也许其他人能做些我做不到的事。我能做的就是复制它。我会把安迪·克莱门特引向这篇文章。祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15110442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档