在spring mvc中,如果要输出xml,则其中一个方法是
<beans>
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>org.springframework.oxm.jaxb.Flight</value>
<value>org.springframework.oxm.jaxb.Flights</value>
</list>
</property
如果类太多,要逐个增加到classTobBeBound外,十分麻烦,因此可以这样做:
public class ClasspathScanningJaxb2Marshaller extends Jaxb2Marshaller {
private static final Logger log = LoggerFactory
.getLogger(ClasspathScanningJaxb2Marshaller.class);
private List<String> basePackages;
public List<String> getBasePackages() {
return basePackages;
}
public void setBasePackages(List<String> basePackages) {
this.basePackages = basePackages;
}
@PostConstruct
public void init() throws Exception {
setClassesToBeBound(getXmlRootElementClasses());
}
private Class<?>[] getXmlRootElementClasses() throws Exception {
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(XmlRootElement.class));
List<Class<?>> classes = new ArrayList<Class<?>>();
for (String basePackage : basePackages) {
Set<BeanDefinition> definitions = scanner.findCandidateComponents(basePackage);
for (BeanDefinition definition : definitions) {
String className = definition.getBeanClassName();
log.info("Found class: {}", className);
classes.add(Class.forName(className));
}
}
return classes.toArray(new Class[0]);
}
}
使用方法,在配置文件中,比如spring-mvc.xml中
<!-- XML视图 -->
<bean id="marshallingView"
class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="com.itownet.isms.core.mapper.ClasspathScanningJaxb2Marshaller">
<property name="basePackages">
<list>
<value>com.abc.model</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
则在对应的xml解析器中,注入刚才的类,其中配置需要解析的xml的实体类所在的包,
这里用basePackage指定