Lorsque plusieurs XSD avec le même espace de nom définissent des types portant le même nom, un type incorrect peut être accidentellement référencé.
Address1.xsd:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="Address"> <xsd:sequence> <xsd:element minOccurs="0" name="city" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> Address2.xsd: <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="Address"> <xsd:sequence> <xsd:element minOccurs="0" name="state" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
Les objets métier ne prennent pas en charge les noms dupliqués pour des structures XSD globales (telles que complexType, simpleType, element, attribute, etc.) par le biais des API BOFactory.create(). Il est cependant possible de créer ces structures globales dupliquées comme enfants d'autres structures si les API correctes sont utilisées, comme indiqué dans les exemples suivants
Customer1.xsd:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://Customer1" targetNamespace="http://Customer1"> <xsd:import schemaLocation="./Address1.xsd"/> <xsd:complexType name="Customer"> <xsd:sequence> <xsd:element minOccurs="0" name="address" type="Address"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
Customer2.xsd:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://Customer2" targetNamespace="http://Customer2"> <xsd:import schemaLocation="./Address2.xsd"/> <xsd:complexType name="Customer"> <xsd:sequence> <xsd:element minOccurs="0" name="address" type="Address"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
Lorsque les champs "Customer address" sont renseignés et que l'API BOFactory.create() est appelée pour créer l'adresse, les types d'objets métier enfants qui en résultent peuvent être définis d'une manière incorrecte. Pour éviter cela, vous pouvez appeler l'API createDataObject("address") sur l'objet de données "Customer". Un enfant de type correct sera ainsi créé, car les objets métier correspondront à l'emplacement de schéma de l'importation.
DataObject customer1 = ... // Manière incorrecte de créer un enfant "Address" // Un type d'adresse Address1.xsd ou Address2.xsd risquerait d'être créé DataObject incorrect = boFactory.create("", "Address"); customer1.set("address", incorrect); // Manière correcte de créer un enfant "Address" // Le type d'adresse Address1.xsd sera ainsi forcément créé customer1.createDataObject("address");