Quel est le but de minOccurs, nillable et restriction?
Documentation pour requis dit:
Si
required()
est
true
puis Javabean propriété est associé à un élément de schéma XML
déclaration avecminOccurs="1"
.maxOccurs
est"1"
pour une seule valeur
propriété et"unbounded"
pour une propriété à valeurs multiples.Si
required()
estfalse
puis le Javabean propriété est mappée à XML
Schéma de la déclaration de l'élément avecminOccurs="0"
.maxOccurs
est"1"
pour un
une seule valeur de la propriété et"unbounded"
pour une propriété à valeurs multiples.
Documentation pour nillable dit:
Si
nillable()
esttrue
puis le JavaBean propriété est mappée à un XML
Schémanillable
la déclaration de l'élément.
Code pour xs:complexType
:
public class WSData {
//...
@XmlElement(required = true, nillable = false)
public void setMonth(XmlMonthType month) {
this.month = month;
}
public void setUserLogin(String userLogin) {
this.userLogin = userLogin;
}
}
Code pour xs:simpleType
:
@XmlType
@XmlEnum(Integer.class)
public enum XmlMonthType {
@XmlEnumValue("1")
JANUARY,
@XmlEnumValue("2")
FEBRUARY,
@XmlEnumValue("3")
MARCH,
/* ... months 4 ~9 ... */
@XmlEnumValue("10")
OCTOBER,
@XmlEnumValue("11")
NOVEMBER,
@XmlEnumValue("12")
DECEMBER;
}
Généré Schéma XML:
<xs:complexType name="wsData">
<xs:sequence>
<xs:element name="month" type="xs:string"/>
<xs:element minOccurs="0" name="userLogin" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="xmlMonthType">
<xs:restriction base="xs:int">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<!-- ... months 4 ~9 ... -->
<xs:enumeration value="10"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
</xs:restriction>
</xs:simpleType>
Les faits:
- La valeur par défaut pour minOccurs est 1. Donc, mois est nécessaire (doit exister);
- Le mois a un restriction. Donc, mois ne peut avoir qu'une valeur définie par l'une des 12 définis énumérations;
- La valeur par défaut pour nillable est faux. Donc, mois ne pouvez pas avoir des valeurs vides;
- Le Schéma XML est généré correctement.
Les problèmes:
- C'est l'acceptation du mois abcense (ne doit pas exister);
- C'est accepter toutes les valeurs par mois, de 13 (sauf quand il n'est pas parseable pour Integer);
- C'est l'acceptation des valeurs vides;
Je ne m'attendais pas à ces problèmes, suis-je raté quelque chose?
Si ce comportement est correct, quel est le but de requis, nillable et xs:restriction?
source d'informationauteur falsarella
Vous devez vous connecter pour publier un commentaire.
Nillable permet à des valeurs vides. Par exemple, si vous avez un Entier ou d'une Date, si elle accepte la valeur null, la balise XML pourrait être vide. Si ce n'est pas nillable, mais pas nécessaire, l'élément XML doivent exister avec un contenu valide ou n'existe pas du tout; une balise vide ne serait pas valide.
La valeur par défaut pour
minOccurs
est l'un, de sorte que lemonth
élément est nécessaire. Notez commentminOccurs="0"
devait être ajouté àuserLogin
de le rendre facultatif.Vous pouvez définir une instance de
Schema
sur le Unmarshaller d'avoir l'avis validé:Démo
Le code suivant peut être utilisé pour générer le schéma XML:
Mise à JOUR
La JAXB RI normalement jette un
ValidationEvent
de gravité 1 pour les problèmes de conversion. La valeur par défautValidationEventHandler
ignore tous les problèmes d'une gravité inférieure à 2. Cela donne généralement la valeur null. Vous pouvez remplacer leValidationEventHandler
comme suit:Cependant la JAXB RI ne semble pas jeter les événements liés à la conversion des valeurs enum (bug possible). Si vous arrive d'être en utilisant EclipseLink JAXB (MOXy) que votre JAXB fournisseur alors vous aurez une exception comme:
Pour Plus D'Informations
Les fins de
required
etminOccurs
ne sont pas induire en erreur, le problème est que la validation de schéma n'est pas activé. Juste permettreSchemaValidation
à laWebService
et définir l'ordre de laXmlType
's de la cartographie comme suit:Service Web:
XmlType:
En effet, il semble que les enveloppes SOAP ne sont pas validés à l'WSDL, ni sur le serveur ou le client.
Et je pense que c'est mieux de cette façon. Validation consomme des ressources et du temps. Pour la plupart des WebServices, tous nous avons besoin avec WSDL est de fournir au client les définitions pour être en mesure de parler à un WebService, et de ne pas définir des restrictions comme si une propriété peut ou ne pas être null.
Lorsque le serveur et le client sont sur le même PC, Axis2 ajoute 3 à 5 millisecondes de surcharge par rapport à des appels internes. Inutile de validation ne ferait qu'augmenter les frais généraux. J'ai de mieux à faire des opérations de lever une exception et valider manuellement ce qui est vraiment nécessaire.
J'ai regardé dans le fichier XSD de la structure que vous avez posté, et de trouver que vous n'avez pas utilisé de type complexe que vous avez défini pour le mois , Insteqad de manipulation sur le code java vous pouvez parler de ce que tout dans XSD , et aussi le minOccur sur mois - élément dans votre type complexe est manquant . Veuillez utiliser le standered XSD pour java générateur , il va faire tous les fichier java tâche de génération pour vous