簡體   English   中英

支持多個XSD版本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM