[英]Supporting multiple xsd versions
讓我解釋一下我的情況,我有一個Web應用程序,它接受xml請求並做出響應。 我已經使用jaxb解析請求,將其轉換為我的應用程序dao對象,處理請求,然后將dao結果轉換為jaxb對象並返回。 現在,我必須支持多個版本(可以根據請求提供不同的xml版本,並且我必須以適當的xml響應進行響應)。 我為jaxb對象-> dao對象轉換器生成Java文件並反轉。 問題在於,在轉換為dao對象之前,先創建jaxb對象,然后對其進行驗證,然后再將其傳遞給我的轉換器。 我不確定要在此處應用哪種設計模式。 可能是適配器模式。 請提出建議? 如果我可能也必須生成jaxb編組和解組代碼,也請注意一下?
希望我能很好地理解您的問題。 因此,您已經擁有:
xml 1 ---> jaxb objects 1 ---> converter 1 ---> entity objects
現在,您需要調整新的xml格式。
為此,您可以編寫一個新轉換器以支持新格式:
xml 2 ---> jaxb objects 2 ---> converter 2 ---> entity objects
或編寫一些xml適配器以使新的jaxb對象適應第一種格式:
xml 2 ---> jaxb objects 2 ---> adapter ---> jaxb objects 1 ---> converter 1 ---> entity objects
我建議第一種方法:編寫一個新的轉換器,以便新格式不依賴於第一種格式(以防萬一可能需要停用第一種格式)。
轉換器將自己與jaxb對象混合在一起,作為實體對象的包裝, @XmlJavaTypeAdapter
為復雜類型提供@XmlJavaTypeAdapter
。 一個非常簡單的例子:
public class XmlPerson {
private Person person;
public XmlPerson(Person person) {
this.person = person;
}
public XmlPerson() {
this.person = new Person();
}
public Person getPerson() {
}
public String getFirstName() {
return person.getFristname();
}
public void setFirstname(String firstName) {
person.setFirstName(firstName);
}
....
@XmlJavaTypeAdapter(XmlAddressAdapter.class)
public Address getAddress() {
return person.getAddress();
}
public void setAddress(Address address) {
person.setAddress(address);
}
}
@XmlJavaTypeAdapter
本身應該從Address
適應(轉換)為XmlAddress
。
public class XmlAddressAdapter extends XmlAdapter<XmlAddress, Address> {
@Override
public Address unmarshal(XmlAddress xmlAddress) throws Exception {
return xmlAddress.getAddress();
}
@Override
public XmlAddress marshal(Address address) throws Exception {
return address != null ? new XmlAddress(address) : null;
}
}
如果我可能也必須生成jaxb編組和解組代碼,也請注意一下?
您只需要將xml對象傳遞給編組器,並使用解組器驗證xsd
,因為您可能已經在這樣做了:
元帥:
JAXBContext jaxbContext = JAXBContext.newInstance(XmlPerson.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.marshal(xmlPerson, output);
解組:
JAXBContext jaxbContext = JAXBContext.newInstance(targetClass);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
SchemaFactory sf = SchemaFactory.newInstance(
javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(XmlInvoice.class.getResource("/yourXsd.xsd"));
jaxbUnmarshaller.setSchema(schema);
Object unmarshalResult = jaxbUnmarshaller.unmarshal(inputStream);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.