2013-03-14 42 views
0

我有一个使用XML作为主配置的Spring MVC项目,包括注册JAXB类。我现在把它变成一个多模块应用程序,并有一个单独的项目来创建一个可选的JAR文件。 JAR文件将类似@Controller和@Service类的东西添加到主MVC项目中,但主项目不依赖于该JAR,并且我想保留它,所以我不想自定义应用程序主项目中的context xml,以便添加对可选JAR的支持;我只是想将该JAR添加到类路径中。混合和扩展Spring XML配置

在那个可选的JAR中,我成功地使用了一个带有@Configuration批注的类来在我的应用程序上下文中创建新的bean,但我现在需要扩展一个现有的bean,以添加新的JAXB批注的类和包的ObjectFactory类的,等

我看不出如何做到这一点...

我试图通配符编组包这样的:

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="packagesToScan" value="com.app.xml.**"/> 
</bean> 

但是这似乎并没有因为我得到:

javax.servlet.ServletException: Unable to locate object to be marshalled in model 

是否有另一种方法可以服用?理想情况下,我想在我的@Configuration类中添加一个方法,它只是将新类添加到现有的Jaxb2Marshaller bean中...

甚至更​​好,找到一种方法让Spring检测所有带有JAXB注释的类在启动...

我使用Spring 3.2.1和JAXB2通过Spring OXM

+0

而不是使用通配符使用分隔的多个包名通过逗号。因为它不识别通配符和属性“packagesToScan”接受字符串数组。 – 2013-03-14 11:45:08

+0

是的,这正是我试图避免的,因为这意味着我从我的主applicationContext.xml创建了对这些包的依赖关系。我正在调查其他方法 – 2013-03-14 11:49:20

回答

0

我没有想到春天也支持这种使用情况,但你可以做的是延长Jaxb2Marshaller,并使用工具如Reflections查找所有具有jaxb注释的类并将其添加到编组器。另外,如果您使用spring并且不介意使用它提供的某些功能,则可以使用类ClassPathScanningCandidateComponentProvider来查找类。这是Spring在内部用来扫描软件包和子包的东西。

0

不能使用<property name="packagesToScan" value="com.app.xml.**"/>作为packagesToScan属性不适用于jaxb2Marshaller .. 而不是您可以使用

<property name="contextPath" value="{package name where all classes are generated}"/> 

以下工作

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" > 
<property name="contextPath" value="{package name where all classes are generated}"/> 
</bean>