Сканирование компонентов не находит @ Component в JAR в веб-приложении Tomcat - PullRequest
6 голосов
/ 21 июля 2011

Я только что подал ошибку в системе ошибок Spring (https://jira.springsource.org/browse/SPR-8551), но я все еще не уверен, что что-то упустил

Я обнаружил проблему с <context:component-scan/> в этом утверждении.Учитывая два следующих класса, которые находятся в одном и том же JAR в WEB-INF / lib веб-приложения (файл JAR имеет структуру каталогов):

test / TheBean.java:

package test;
@Component
public class TheBean{
}

test / BeanSearcher.java:

package test;
public class BeanSearcher{

  public void init(){ 
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
    ctx.scan("test"); 
    ctx.refresh(); 
    TheBean b=  ctx.getBean(TheBean.class); 
    // What is the value of b? 
  }
}

Если я запускаю new BeanSearcher().init() в тестовом примере jUnit или в другом типе отдельного приложения, b получает назначенный экземпляр TheBean, но если я его запускаю,скажем, в JSP ctx.getBean() возвращает ноль.

Итак, я делаю что-то не так или не принимаю что-то во внимание, это просто ошибка ...?

РЕДАКТИРОВАТЬ 8/ 8/2011: Кажется, это работает хорошо, когда я пытался упростить проблему, но, тем не менее, когда я пытаюсь заставить ее работать, при инициализации OpenCms это не удается.Сейчас я пытаюсь найти различия между рабочими версиями и той, которая не работает.(Загрузчик классов, использование соответствующих классов в разных JAR-файлах или непосредственно в WEB-INF / классах, вызовы через рефлексию и т. Д.)

Ответы [ 2 ]

10 голосов
/ 24 декабря 2012

Как я уже писал в комментарии, решение дается ответом здесь: Контроллеры на основе Spring Annotation не работают, если они находятся внутри jar-файла

При экспорте файла JAR с использованием утилиты экспорта в Eclipse это опция под названием Добавить записи каталога.

2 голосов
/ 22 июля 2011

Очевидный вопрос: есть ли у вас такие вещи в вашем web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/foo.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Без них Spring вообще не будет загружаться, не говоря уже о том, чтобы правильно создавать бины…

...