0

Spring で構築され、Jboss 内で実行される Web アプリケーションがあります。実行時に、特定の注釈を持つクラスをスキャンしようとしています。現在、オープン ソースのReflections ライブラリを使用しています。

public static List<Class> scanForClassesWithAnnotation(Class<? extends Annotation> annotationClass)
{
    List<Class> classesWithAnnotation = new ArrayList<>();
    for(Package p : Package.getPackages())
    {
        LOGGER.info("scanForClassesWithAnnotation: Examining package " + p.getName());

        try
        {
            List<ClassLoader> classLoadersList = new ArrayList<>();
            classLoadersList.add(ClasspathHelper.contextClassLoader());
            classLoadersList.add(ClasspathHelper.staticClassLoader());

            Reflections reflections = new Reflections(
                new ConfigurationBuilder()
                    .setScanners(new SubTypesScanner(false), new ResourcesScanner())
                    .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[classLoadersList.size()])))
                    .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(p.getName()))));

            Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);

            LOGGER.info("\tscanForClassesWithAnnotation: found classes " + JsonUtils.objectToJson(classes));

            for(Class foundClass : classes)
            {
                if(foundClass.isAnnotationPresent(annotationClass))
                {
                    classesWithAnnotation.add(foundClass);
                }
            }
        } catch (Exception ignored) {}
    }
    return classesWithAnnotation;
}

このコードを実行すると、ログに次のようなメッセージが多数表示されます。

given scan urls are empty. set urls in the configuration

このコードはスタンドアロンの Maven プロジェクトで機能するため、一般的に機能することがわかっています。しかし、問題は、コードがサーブレット コンテキストで実行されているという事実にあると思います。これを修正するにはどうすればよいですか? Spring webapp でアノテーションを使用してクラスをスキャンするにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

0

これは機能します

    public static List<Class> scanForClassesWithAnnotation2(Class<? extends Annotation> annotationClass)
{
    List<Class> classesWithAnnotation = new ArrayList<>();

    ClassPathScanningCandidateComponentProvider scanner =
        new ClassPathScanningCandidateComponentProvider(false);

    scanner.addIncludeFilter(new AnnotationTypeFilter(annotationClass));

    for (BeanDefinition bd : scanner.findCandidateComponents("com.example"))
    {
        try
        {
            classesWithAnnotation.add(Class.forName(bd.getBeanClassName()));
        } catch (ClassNotFoundException e)
        {
            LOGGER.error("Could not create class from class name");
        }
    }

    return classesWithAnnotation;
}
于 2014-06-04T22:09:03.397 に答える