混合和扩展Spring XML配置

时间:2013-03-14 11:27:48

标签: spring jaxb

我有一个Spring MVC项目,它使用XML作为主配置,包括注册JAXB类。我现在将它变成一个多模块应用程序,并有一个单独的项目,创建一个可选的JAR文件。 JAR文件将诸如@Controller和@Service类之类的东西添加到主MVC项目中,但是主项目不依赖于那个JAR,我想保持这种方式,所以我不想自定义应用程序主项目中的上下文xml,以便添加对可选JAR的支持;我只想将JAR添加到类路径中。

在可选的JAR中,我成功地使用带有@Configuration批注的类在我的应用程序上下文中创建新bean,但我现在需要扩展现有的bean,添加新的JAXB带注释的类和包含ObjectFactory的包班级等。

我看不出怎么做......

我试图像这样通配marshaller包:

<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 OXM使用Spring 3.2.1和JAXB2

2 个答案:

答案 0 :(得分:0)

我不认为spring支持这个用例,但你可以做的是扩展Jaxb2Marshaller,并使用像Reflections这样的实用程序来查找所有具有jaxb注释的类并将它们添加到marshaller。

此外,如果您使用spring并且不介意使用它提供的某些功能,则可以使用类ClassPathScanningCandidateComponentProvider来查找类。这是spring在内部用于扫描包和子包的内容。

答案 1 :(得分:0)

你不能使用<property name="packagesToScan" value="com.app.xml.**"/>,因为packageToScan属性不适用于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>