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>
Другие вопросы по тегам