情況是,供應商爲其XML文檔提供了XML架構,供他們提交給我的服務。我不喜歡它們的模式,所以我編寫了自己的模式和XSLT來轉換接收到的XML。我的模式與JAXB的xjc工具一起使用來生成將某些pojos綁定到合適的對象模型中的.java文件。如果不是因爲需要進行轉換步驟,那麼在Spring MVC中實現這將會很簡單。JAXB Domain對象的Spring MVC @RequestBody AFTER收到的XML的XSLT轉換
收到的XML在映射到JAXB類之前必須首先進行轉換。大致類似於下面的代碼片段:
@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註解來執行變換&解組?也許就像這個虛構的代碼片段:
@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」搜索處理轉換輸出而不是輸入。