XmlViewResolver
用于解析 XML 视图的视图解析器。它通常与 JAXB 或 JAXP 等 XML 处理技术一起使用,将模型数据转换为 XML 格式的响应。你也可以自定义xml view组件,默认定义地址为/WEB-INF/views.xml,你也可以指定views.xml对应的Resource。
肖哥弹架构 跟大家“弹弹” SpringBoot源码,需要代码关注
欢迎 点赞,点赞,点赞。
关注公号Solomon肖哥弹架构获取更多精彩内容
类结构设计
业务需求案例:
在一个金融服务平台需要向合作伙伴提供交易报告的 XML 格式输出。合作伙伴系统需要通过这些 XML 报告进行数据同步和分析。
1. 定义 XML 视图:
首先,定义一个 XML 视图,该视图使用 JAXB 注解将模型数据转换为 XML。
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "TransactionReport")
public class TransactionReport {
private String transactionId;
private Date transactionDate;
private BigDecimal amount;
// 标准的 getter 和 setter
@XmlElement
public String getTransactionId() {
return transactionId;
}
@XmlElement
public void setTransactionId(String transactionId) {
this.transactionId = transactionId;
}
// 其他字段的 getter 和 setter
}
2. 配置 XmlViewResolver
:
在 Spring 配置中设置 XmlViewResolver
。
Java 配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.xml.MarshallingView;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver xmlViewResolver() {
MarshallingView xmlView = new MarshallingView();
xmlView.setMarshaller(jaxb2Marshaller()); // 使用 JAXB2 提供的 Marshaller
return xmlView;
}
@Bean
public Jaxb2Marshaller jaxb2Marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("com.example.model"); // 指定模型的包路径
return marshaller;
}
@Bean
public XmlViewResolver xmlViewResolver() {
XmlViewResolver resolver = new XmlViewResolver();
resolver.setLocation("/WEB-INF/views.xml"); // 设置 XML 文件的位置
return resolver;
}
}
XML 配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.springframework.org/schema/beans/spring-beans.xsd"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:view-resolvers>
<mvc:xml-view-resolver />
</mvc:view-resolvers>
<!-- 其他Spring MVC配置 -->
</beans>
/WEB-INF/views.xml
文件配置:
views.xml
文件包含以下内容,属于自定义扩展设计:
<views xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<view name="transactionReport">
<entry>
<key>contentType</key>
<value>application/xml</value>
</entry>
<entry>
<key>marshallerClass</key>
<value>com.example.Jaxb2Marshaller</value>
</entry>
</view>
</views>
在这个 XML 文件中,我们定义了一个名为 transactionReport
的视图,它指定了响应的 contentType
和用于 XML 转换的 marshallerClass
。
3. 控制器:
创建控制器来处理交易报告请求,并返回模型数据。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TransactionController {
@GetMapping("/reports/transaction")
@ResponseBody
public TransactionReport getTransactionReport() {
// 处理交易报告请求
TransactionReport report = transactionService.generateReport();
return report; // 将由 XmlViewResolver 转换为 XML 响应
}
}
4. 客户端请求:
客户端通过发送 GET 请求来获取交易报告的 XML 输出。
GET /reports/transaction
Accept: application/xml
5. 视图解析器解析视图:
XmlViewResolver
将控制器返回的 TransactionReport
对象转换为 XML 格式的响应。
5. XmlViewResolver 核心代码:
protected View loadView(String viewName, Locale locale) throws BeansException {
BeanFactory factory = initFactory();
try {
// 根据viewName从自定义的XML上下文中获取View实例返回
return factory.getBean(viewName, View.class);
}catch (NoSuchBeanDefinitionException ex) {
// Allow for ViewResolver chaining...
return null;
}
}
protected synchronized BeanFactory initFactory() throws BeansException {
if (this.cachedFactory != null) {
return this.cachedFactory;
}
//获取项目上下文对象
ApplicationContext applicationContext = obtainApplicationContext();
Resource actualLocation = this.location;
if (actualLocation == null) {
//加载默认/WEB-INF/views.xml view资源
actualLocation = applicationContext.getResource(DEFAULT_LOCATION);
}
// 创建一个子上下文来管理views
GenericWebApplicationContext factory = new GenericWebApplicationContext();
factory.setParent(applicationContext);
factory.setServletContext(getServletContext());
//加载XML VIEW资源到应用上下文中,其实就在存入IOC容器进行管理
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.setEnvironment(applicationContext.getEnvironment());
reader.setEntityResolver(new ResourceEntityResolver(applicationContext));
reader.loadBeanDefinitions(actualLocation);
factory.refresh();
if (isCache()) {
this.cachedFactory = factory;
}
return factory;
}
总结:
XmlViewResolver
允许开发者轻松地将模型数据转换为 XML 格式的响应,以满足需要 XML 数据的业务需求。- 它与 JAXB 或 JAXP 等 XML 处理技术集成,提供了一种声明式的方式来处理 XML 数据的生成。
- 结合 Spring MVC 控制器,可以轻松地根据不同的业务需求返回 XML 格式的响应。
你的点赞与关注 是 Solomon_肖哥弹架构持续的动力。