【发布时间】:2012-09-16 10:53:48
【问题描述】:
情况是供应商为他们的 XML 文档提供了一个 XML 模式,他们可以提交给我的服务。我不喜欢他们的架构,因此我编写了自己的架构以及 XSLT 来转换接收到的 XML。我的模式与 JAXB 的 xjc 工具一起使用来生成 .java 文件,这些文件将一些 pojo 绑定到合适的对象模型中。如果不是因为需要转换步骤,那么在 Spring MVC 中实现这将是微不足道的。
接收到的 XML 在映射到 JAXB 类之前必须先进行转换。大致类似于下面的sn-p:
@RequestMapping(value="/receiveXml", method=RequestMethod.POST )
public ResponseEntity<String> receiveXml( @RequestBody String vendorXmlPayload ) {
// 1. Make sure vendorXmlPayload adheres to vendor's schema
vendorSchema.newValidator().validate(new StreamSource(new StringReader(vendorXmlPayload)));
// 2. Transform xml payload to my schema
StringWriter sw = new StringWriter();
transformer.transform(new StreamSource(new StringReader(vendorXmlPayload)), new StreamResult(sw))
// 3. Validate transformed XML against my schema
mySchema.newValidator().validate(new StreamSource(new StringReader(sw.toString())));
// 4. Unmarshall to JAXB-annotated classes
DomainObject obj = (DomainObject) unmarshaller.unmarshal(new StreamSource(new StringReader(sw.toString())));
(errors != null) ? return ... HttpStatus.BAD_REQUEST : return ..... HttpStatus.OK
}
是否有一些优雅的 Spring 注释可以将所有这些都浓缩在 MVC 控制器上?即有没有办法使用 @RequestBody 注释或其他东西来执行转换和解组?也许就像这个虚构的sn-p:
@RequestMapping(value="/receiveXml", method=RequestMethod.POST )
@Transform(transformer="myTransform.xslt")
public ResponseEntity<String> receiveXml( @RequestBody DomainObj domainObj)
{
// Process my DomainObj as I normally would
(errors != null) ? return ... HttpStatus.BAD_REQUEST : return ..... HttpStatus.OK
}
@InitBinder 看起来不太适合这种情况。大多数“Spring MVC XSLT”搜索处理的是转换输出而不是输入。
【问题讨论】:
标签: java xml xslt spring-mvc jaxb