You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Lex Uijthof (JIRA)" <ji...@apache.org> on 2015/01/19 10:40:35 UTC
[jira] [Closed] (CXF-6201) Issue parsing xs:choice with maxoccurs
attribute when using cxf-codegen-plugin
[ https://issues.apache.org/jira/browse/CXF-6201?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lex Uijthof closed CXF-6201.
----------------------------
Resolution: Invalid
> Issue parsing xs:choice with maxoccurs attribute when using cxf-codegen-plugin
> ------------------------------------------------------------------------------
>
> Key: CXF-6201
> URL: https://issues.apache.org/jira/browse/CXF-6201
> Project: CXF
> Issue Type: Bug
> Components: JAXB Databinding
> Affects Versions: 2.7.14
> Environment: windows 7 Professional, JDK 1.7.0_71, mvn 3.2.3
> Reporter: Lex Uijthof
> Labels: bindings, choice, jaxb, maven, wsdl2java
>
> I'm trying to create a client based on a WDSL and it's XSD's from an external party.
> I don't want to modify the XSD's manually, because the schema's change once in a while.
> In the plugins excecution part of my Pom I have the following configuration:
> <configuration>
> <additionalJvmArgs>-Dfile.encoding=UTF8</additionalJvmArgs>
> <defaultOptions>
> <bindingFiles>
> <bindingFile>${basedir}/src/main/resources/bindings.xjb</bindingFile>
> </bindingFiles>
> <extraargs>
> <extraarg>-client</extraarg>
> <extraarg>-verbose</extraarg>
> <extraarg>-xjc-Xvalue-constructor</extraarg>
> <extraarg>-xjc-Xfluent-api</extraarg>
> <extraarg>-xjc-Xcollection-setter-injector</extraarg>
> <exreaarg>-autoNameResolution</exreaarg>
> </extraargs>
> </defaultOptions>
> <sourceRoot>/${basedir}/src-generated/main/java/</sourceRoot>
> <wsdlOptions>
> <wsdlOption>
> <wsdl>/${basedir}/src/main/resources/bg0310/vraagAntwoord/bg0310_beantwoordVraag_vraagAntwoord.wsdl</wsdl>
> </wsdlOption>
> </wsdlOptions>
> </configuration>
> My bindings.xjb:
> <jxb:bindings
> xmlns:xs="http://www.w3.org/2001/XMLSchema"
> xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
> xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
> jxb:extensionBindingPrefixes="xjc"
> version="2.1">
> <jxb:globalBindings
> underscoreBinding="asCharInWord"
> fixedAttributeAsConstantProperty="true"
> choiceContentProperty="false">
> <jxb:javaType name="java.lang.Integer" xmlType="xs:int"/>
> <jxb:javaType name="java.lang.Integer" xmlType="xs:positiveInteger"/>
> </jxb:globalBindings>
> </jxb:bindings>
> The part of the XSD that is parsed incorrectly :
> <complexType name="NPSNINING-basis">
> <annotation>
> <documentation>Gezamenlijk basistype voor Natuurlijk persoon, ingezetene en niet-ingezetene</documentation>
> </annotation>
> <sequence>
> <choice minOccurs="0" maxOccurs="2">
> <element name="inp.bsn" type="BG:BSN-e" nillable="true" minOccurs="0"/>
> <element name="authentiek" type="BG:Authentiek" default="N" nillable="true" minOccurs="0"/>
> <element name="anp.identificatie" type="BG:IdentificatieRPSBTL-e" nillable="true" minOccurs="0"/>
> </choice>
> </sequence>
> <attribute ref="StUF:entiteittype"/>
> <attributeGroup ref="StUF:entiteit"/>
> </complexType>
> When parsed the following Java class is generated:
> @XmlAccessorType(XmlAccessType.FIELD)
> @XmlType(name = "NPSNINING-basis", propOrder = {
> "inpBsnOrAuthentiekOrAnpIdentificatie"
> })
> public class NPSNININGBasis {
> @XmlElements({
> @XmlElement(name = "inp.bsn", type = BSNE.class, nillable = true),
> @XmlElement(name = "authentiek", type = Authentiek.class, defaultValue = "N", nillable = true),
> @XmlElement(name = "anp.identificatie", type = IdentificatieRPSBTLE.class, nillable = true)
> })
> protected List<Object> inpBsnOrAuthentiekOrAnpIdentificatie;
> .
>
> public List<Object> getInpBsnOrAuthentiekOrAnpIdentificatie() {
> if (inpBsnOrAuthentiekOrAnpIdentificatie == null) {
> inpBsnOrAuthentiekOrAnpIdentificatie = new ArrayList<Object>();
> }
> return this.inpBsnOrAuthentiekOrAnpIdentificatie;
> }
>
> public void setInpBsnOrAuthentiekOrAnpIdentificatie(List<Object> inpBsnOrAuthentiekOrAnpIdentificatie) {
> this.inpBsnOrAuthentiekOrAnpIdentificatie = inpBsnOrAuthentiekOrAnpIdentificatie;
> }
> public NPSNININGBasis withInpBsnOrAuthentiekOrAnpIdentificatie(Object... values) {
> if (values!= null) {
> for (Object value: values) {
> getInpBsnOrAuthentiekOrAnpIdentificatie().add(value);
> }
> }
> return this;
> }
> public NPSNININGBasis withInpBsnOrAuthentiekOrAnpIdentificatie(Collection<Object> values) {
> if (values!= null) {
> getInpBsnOrAuthentiekOrAnpIdentificatie().addAll(values);
> }
> return this;
> }
> }
>
> The globalbinding param choiceContentProperty="false" normally creates 3 different Jaxbelement type values for each element inside the choice and that is what i need, because i need to be able to set nill='true' on eacht of these elements.
> When I just remove the maxOccurs="2" in the choice element, the following code is generated:
> @XmlAccessorType (XmlAccessType.FIELD)
> @XmlType (
> name = "NPSNINING-basis",
> propOrder = {
> "inpBsn",
> "authentiek",
> "anpIdentificatie"
> })
> public class NPSNININGBasis {
> @XmlElementRef (
> name = "inp.bsn",
> namespace = "http://www.egem.nl/StUF/sector/bg/0310",
> type = JAXBElement.class,
> required = false
> )
> protected JAXBElement<BSNE> inpBsn;
> @XmlElementRef (
> name = "authentiek",
> namespace = "http://www.egem.nl/StUF/sector/bg/0310",
> type = JAXBElement.class,
> required = false
> )
> protected JAXBElement<Authentiek> authentiek;
> @XmlElementRef (
> name = "anp.identificatie",
> namespace = "http://www.egem.nl/StUF/sector/bg/0310",
> type = JAXBElement.class,
> required = false
> )
>
> public JAXBElement<BSNE> getInpBsn () {
> return inpBsn;
> }
>
> public void setInpBsn (JAXBElement<BSNE> value) {
> this.inpBsn = value;
> }
>
> public JAXBElement<Authentiek> getAuthentiek () {
> return authentiek;
> }
>
> public void setAuthentiek (JAXBElement<Authentiek> value) {
> this.authentiek = value;
> }
>
> public JAXBElement<IdentificatieRPSBTLE> getAnpIdentificatie () {
> return anpIdentificatie;
> }
>
> public void setAnpIdentificatie (JAXBElement<IdentificatieRPSBTLE> value) {
> this.anpIdentificatie = value;
> }
>
> public NPSNININGBasis withInpBsn (JAXBElement<BSNE> value) {
> setInpBsn (value);
> return this;
> }
> public NPSNININGBasis withAuthentiek (JAXBElement<Authentiek> value) {
> setAuthentiek (value);
> return this;
> }
> public NPSNININGBasis withAnpIdentificatie (JAXBElement<IdentificatieRPSBTLE> value) {
> setAnpIdentificatie (value);
> return this;
> }
> }
> This generated code is exactly what I need.
> I believe there should not be any difference in parsing an xs:choice with a maxOccurs and an xs:choice without a maxOccurs, since the maxOccurs attribure is pure for validation.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)