3

xml 要求を受け取って応答する Web アプリケーションがあるシナリオを説明しましょう。jaxb を使用してリクエストを解析し、アプリケーションの dao オブジェクトに変換し、リクエストを処理してから、dao の結果を jaxb オブジェクトに再変換して返しました。今、私は複数のバージョンをサポートする必要があります (異なる xml バージョンが要求として来る可能性があり、適切な xml 応答で応答する必要があります)。jaxb オブジェクト -> dao オブジェクト コンバーターとその逆の Java ファイルを生成します。問題は、dao オブジェクトに変換する前に、jaxb オブジェクトが作成され、コンバーターに渡す前に検証されることです。ここでどのデザインパターンを適用すればよいかわかりません。アダプターのパターンかもしれません。提案してください?また、jaxb マーシャリングおよびアンマーシャリング コードも生成する必要がある場合は、光を投げますか?

4

1 に答える 1

2

うまくいけば、私はあなたの問題をよく理解しました。だからあなたはすでに持っています:

xml 1 ---> jaxb objects 1 ---> converter 1 ---> entity objects

次に、新しい xml 形式に対応する必要があります。

このために、新しいフォーマットをサポートする新しいコンバーターを作成できます。

xml 2 ---> jaxb objects 2 ---> converter 2 ---> entity objects

または、新しい jaxb オブジェクトを最初の形式に適合させるために、いくつかの xml アダプターを記述します。

xml 2 ---> jaxb objects 2 ---> adapter ---> jaxb objects 1 ---> converter 1 ---> entity objects

最初のアプローチをお勧めします。新しいコンバーターを作成して、新しいフォーマットが最初のフォーマットに依存しないようにすることです(最初のフォーマットを廃止する必要がある場合に備えて)。

@XmlJavaTypeAdapterコンバーターは、エンティティ オブジェクトのラッパーとして、 for 複合型と共に jaxb オブジェクトと混合します。非常に簡単な例:

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);
于 2012-08-25T06:54:42.600 に答える