Spring 3 Проблемы компиляции времени компиляции для объектов в зависимости от jar с @Configurable (с использованием Maven)
Погуглил и слишком долго работал над этим. Перебирал также и другие сообщения от stackru, но все же был озадачен тем, что здесь происходит.
Прежде всего, что я хочу:
У меня есть постоянная банка, которая используется в качестве зависимости в моем веб-проекте. Внутри этой персистентной фляги даос настраиваются просто отлично, используя конфигурацию Spring из веб-проекта. Теперь я хочу сделать базовый класс (абстрактный). Я хочу иметь возможность внедрить набор свойств в строку, но классы, расширяющие этот абстрактный класс, напрямую не контролируются через Spring (например, создаются с помощью new MyImp().)
Из всего, что я собираю, мне нужно использовать @Configurable.
Странно то, что код все компилируется (с Maven, использующим плагин аспектов), и я думаю, что некоторое переплетение должно происходить, потому что вызовы объектов, расширяющих абстрактный класс @Configurable, похоже, попадают в "черную дыру" - ошибок пока нет Ничто даже не может быть напечатано в системе с помощью старых операторов skool System.out.print??? Действительно странно.
Ниже я думаю, что уместная информация о том, как у меня все настроено...(очевидно, не показывает все):
Весенний конфиг веб-проекта:
<util:properties id="props" location="classpath:application.properties"/>
<context:annotation-config />
<context:spring-configured/>
<context:component-scan base-package="com.foo" />
<bean class="com.foo.MyAbstractClass" abstract="true" scope="prototype">
<property name="xlsDir" value="${xlsDir}"/>
</bean>
//some DAOs are injected with datasources..not shown. Props being set just fine for the
//datasources from application.properties, and the DAOs will work fine
Фляга, используемая вышеупомянутым веб-проектом (который содержит MyAbstractClass и его потомков), не имеет никакого XML. Различные файлы расширяют MyAbstractClass и создаются в приложении с помощью new: MyImp imp = new MyImp (); imp.bar();
MyAbstractClass соответствующая информация:
@Configurable
public abstract class MyAbstractClass {
private String xlsDir;
public void setXlsDir(String xlsDir) {
this.xlsDir = xlsDir;
}
public void bar() {
System.out.println("this won't even get printed, yet no errors!");
System.out.println("xlsDir is "+xlsDir);
}
}
Позже я могу поиграться с @Autowiring и использовать @Value (это то, что я впервые попробовал в любом случае), но сейчас я даже не уверен, что ткачество работает правильно. Может быть, проблема в том, что jar-файл персистентности сначала компилируется с помощью maven (с ткачеством) - но пока он не знает, что такое установщик для xlsDir, на основе веб-проекта? Это не объясняет, почему вызовы bar() просто исчезают, поэтому что-то происходит.
Для обоих проектов я настроил maven для компиляции на основе того, что я видел, когда Pom Spring Roo делал (в интернете крайне сложно пригвоздить то, что нужно в этом pom для ткачества maven с пружиной.)
Вот соответствующая информация о помпе (комментарии оставленной весной руо ниже - они не мои):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.2</version> <!-- NB: do use 1.3 or 1.3.x due to MASPECTJ-90 - wait for 1.4 -->
<dependencies>
<!-- NB: You must use Maven 2.0.9 or above or these are ignored (see
MNG-2972) -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
Любая помощь высоко ценится. Я собираюсь сдаться в ближайшее время и просто загрузить свой файл свойств в статический блок и покончим с этим:)
1 ответ
Определение бина
<bean class="com.foo.MyAbstractClass" abstract="true" scope="prototype">
<property name="xlsDir" value="${xlsDir}"/>
</bean>
ничего не делает, если не используется в качестве родителя в определениях других компонентов. Если вы хотите, чтобы bean-компоненты @Configurable стали автоматически подключенными, используйте @Configurable(autowire=Autowire.BY_NAME) и объявите боб String с name="xlsDir"
<bean id="xlsDir" class="java.lang.String" factory-method="valueOf">
<constructor-arg value="${xlsDir}"/>
</bean>