0

public aspect ....結果をページ分割するために、 a を返す多くのメソッドの結果を操作する(spectj 構文で記述された) アスペクトがあります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]

どうすればこれを取り除くことができますか?

ステファノ

-- アスペクト コードの抜粋を追加

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
    }

}

使用例

Collection<MyEntity> entities = myEntityService.findAll(criteria);

そこで警告を受けます

4

1 に答える 1

1

悪いニュース: 警告を回避する方法がわかりません。Java のジェネリック、特に AspectJ に関連していないtarget()ためです。タイプ消去の制限)。

おそらく、AspectJ メーリング リストでこれと同じ問題を抱えているでしょう。

幸いなことに、多くのダミー クラスを使用して、アプリケーションでそれらをどのように使用するかについて知識に基づいた推測を行い、最小限のコード サンプルで問題を再現することができました。

ダミー/ヘルパー クラス/アスペクト:

package org.jcz.persistence;
public class EntitySupport {}
package org.jcz.persistence;
public class MyEntity {}
package org.jcz.persistence;
public class Pagination {}
package org.jcz.persistence;

public class Criteria {
    public Pagination getPagination() {
        return new Pagination();
    }
}
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>();
    }
}
package org.jcz.persistence;
public abstract aspect ServiceSupportAspect {}

あなたの側面は、わずかに変更されました:

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 警告を再現する小さなドライバー アプリケーション:

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);
    }
}

私にはできない何かを、他の誰かが作ることができるかもしれません。私ができる最善のことは、それを再現することでした。Andy Clement にこの投稿を紹介してみます。幸運を!

于 2013-03-16T11:48:58.937 に答える