如何在子类和父类中创建具有相同XML标签的POJO?

huangapple 未分类评论66阅读模式
英文:

How to create pojo with same xml tag in child and parent

问题

package com.test1;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "cotest"
})
@XmlRootElement(name = "universe")
public class Universe {

    @XmlElement(required = true)
    protected Universe.Cotest cotest;

    public Universe.Cotest getCotest() {
        return cotest;
    }

    public void setCotest(Universe.Cotest value) {
        this.cotest = value;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "test"
    })
    public static class Cotest {

        @XmlElement(required = true)
        protected Universe.Cotest.Test test;

        public Universe.Cotest.Test getTest() {
            return test;
        }

        public void setTest(Universe.Cotest.Test value) {
            this.test = value;
        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {
            "country"
        })
        public static class Test {

            @XmlElement(required = true)
            protected Universe.Cotest.Test.Country country;

            public Universe.Cotest.Test.Country getCountry() {
                return country;
            }

            public void setCountry(Universe.Cotest.Test.Country value) {
                this.country = value;
            }

            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "", propOrder = {
                "states"
            })
            public static class Country {

                @XmlElement(required = true)
                protected Universe.Cotest.Test.Country.States states;

                public Universe.Cotest.Test.Country.States getStates() {
                    return states;
                }

                public void setStates(Universe.Cotest.Test.Country.States value) {
                    this.states = value;
                }

                @XmlAccessorType(XmlAccessType.FIELD)
                @XmlType(name = "", propOrder = {
                    "requirement"
                })
                public static class States {

                    @XmlElement(required = true)
                    protected Universe.Cotest.Test.Country.States.Requirement requirement;

                    public Universe.Cotest.Test.Country.States.Requirement getRequirement() {
                        return requirement;
                    }

                    public void setRequirement(Universe.Cotest.Test.Country.States.Requirement value) {
                        this.requirement = value;
                    }

                    @XmlAccessorType(XmlAccessType.FIELD)
                    @XmlType(name = "", propOrder = {
                        "cashitem"
                    })
                    public static class Requirement {

                        @XmlElement(required = true)
                        protected Universe.Cotest.Test.Country.States.Requirement.States states;
                        @XmlAttribute(name = "type", required = true)
                        protected String type;

                        public Universe.Cotest.Test.Country.States.Requirement.States getStates() {
                            return states;
                        }

                        public void setStates(Universe.Cotest.Test.Country.States.Requirement.States value) {
                            this.states = value;
                        }

                        public String getType() {
                            return type;
                        }

                        public void setType(String value) {
                            this.type = value;
                        }

                        @XmlAccessorType(XmlAccessType.FIELD)
                        @XmlType(name = "", propOrder = {
                            "cashitem"
                        })
                        public static class States {

                            @XmlElement(required = true)
                            protected Universe.Cotest.Test.Country.States.Requirement.States.Cashitem cashitem;

                            public Universe.Cotest.Test.Country.States.Requirement.States.Cashitem getCashitem() {
                                return cashitem;
                            }

                            public void setCashitem(Universe.Cotest.Test.Country.States.Requirement.States.Cashitem value) {
                                this.cashitem = value;
                            }

                            @XmlAccessorType(XmlAccessType.FIELD)
                            @XmlType(name = "", propOrder = {
                                "currency",
                                "val"
                            })
                            public static class Cashitem {

                                @XmlElement(required = true)
                                protected String currency;
                                @XmlElement(required = true)
                                protected String val;

                                public String getCurrency() {
                                    return currency;
                                }

                                public void setCurrency(String value) {
                                    this.currency = value;
                                }

                                public String getVal() {
                                    return val;
                                }

                                public void setVal(String value) {
                                    this.val = value;
                                }

                            }

                        }

                    }

                }

            }

        }

    }

}

Please let me know if you need further assistance.

英文:

I am having an xml which has xml tags (states) same as that of parent and child. So while creating the pojos using the jaxb xjc command, I am getting 2 static inner classes with same name. I tried using bindings.xml but my problem didnt resolve and instead I am not getting error. Please find all the details below

XML:

<universe>
<cotest>
<test>
<country>
<states>
<requirement type="op">
<states>
<cashitem>
<currency>usd</currency>
<val>o</val>
</cashitem>
</states>
</requirement>
</states>
</country>
</test>
</cotest>
</universe>

This is XSD thats I generated online

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="universe">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="cotest">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="test">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="country">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="states">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="requirement">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="states">
                                        <xs:complexType>
                                          <xs:sequence>
                                            <xs:element name="cashitem">
                                              <xs:complexType>
                                                <xs:sequence>
                                                  <xs:element name="currency" type="xs:string" />
                                                  <xs:element name="val" type="xs:string" />
                                                </xs:sequence>
                                              </xs:complexType>
                                            </xs:element>
                                          </xs:sequence>
                                        </xs:complexType>
                                      </xs:element>
                                    </xs:sequence>
                                    <xs:attribute name="type" type="xs:string" use="required" />
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

bindings.xml

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false" fixedAttributeAsConstantProperty="true" choiceContentProperty="true" localScoping="toplevel"/>
    </jaxb:bindings>
    <jaxb:bindings  schemaLocation="abc.xsd" node="/xs:schema">
        <jaxb:bindings node="//xs:schema//xs:element[@name='universe']//xs:sequence//xs:element[@name='states']//xs:complexType//xs:sequence//xs:element[@name='states']">
    <jaxb:class name="object2" />
</jaxb:bindings>

    </jaxb:bindings>
</jaxb:bindings>

I am executing xjc using the command xjc -b bindings.xml -d photos -p com.test1 abc.xsd

error:

parsing a schema...
compiling a schema...
[ERROR] A class/interface with the same name "com.test1.States" is already in us
e. Use a class customization to resolve this conflict.
  line 17 of file:/D:/user/abc.xsd

[ERROR] (Relevant to above error) another "States" is generated from here.
  line 23 of file:/D:/user/abc.xsd

[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 17 of file:/D:/user/abc.xsd

[ERROR] (Related to above error) This is the other declaration.
  line 23 of file:/D:/user/abc.xsd

Failed to produce code.

If I dont use bindings.xml then i can see classes are generated but have duplicate inner classes and hence my eclipse IDE shows compile time error
command: xjc -d photos -p com.test1 abc.xsd

package com.test1;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "cotest"
})
@XmlRootElement(name = "universe")
public class Universe {

    @XmlElement(required = true)
    protected Universe.Cotest cotest;

    public Universe.Cotest getCotest() {
        return cotest;
    }

    public void setCotest(Universe.Cotest value) {
        this.cotest = value;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "test"
    })
    public static class Cotest {

        @XmlElement(required = true)
        protected Universe.Cotest.Test test;

        public Universe.Cotest.Test getTest() {
            return test;
        }

        public void setTest(Universe.Cotest.Test value) {
            this.test = value;
        }


        
        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {
            "country"
        })
        public static class Test {

            @XmlElement(required = true)
            protected Universe.Cotest.Test.Country country;

           
            public Universe.Cotest.Test.Country getCountry() {
                return country;
            }

            
            public void setCountry(Universe.Cotest.Test.Country value) {
                this.country = value;
            }

            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "", propOrder = {
                "states"
            })
            public static class Country {

                @XmlElement(required = true)
                protected Universe.Cotest.Test.Country.States states;

                
                public Universe.Cotest.Test.Country.States getStates() {
                    return states;
                }

                
                public void setStates(Universe.Cotest.Test.Country.States value) {
                    this.states = value;
                }


                
                @XmlAccessorType(XmlAccessType.FIELD)
                @XmlType(name = "", propOrder = {
                    "requirement"
                })
                public static class States {

                    @XmlElement(required = true)
                    protected Universe.Cotest.Test.Country.States.Requirement requirement;

                    
                    public Universe.Cotest.Test.Country.States.Requirement getRequirement() {
                        return requirement;
                    }

                    
                    public void setRequirement(Universe.Cotest.Test.Country.States.Requirement value) {
                        this.requirement = value;
                    }

                    @XmlAccessorType(XmlAccessType.FIELD)
                    @XmlType(name = "", propOrder = {
                        "states"
                    })
                    public static class Requirement {

                        @XmlElement(required = true)
                        protected Universe.Cotest.Test.Country.States.Requirement.States states;
                        @XmlAttribute(name = "type", required = true)
                        protected String type;

                        
                        public Universe.Cotest.Test.Country.States.Requirement.States getStates() {
                            return states;
                        }

                        
                        public void setStates(Universe.Cotest.Test.Country.States.Requirement.States value) {
                            this.states = value;
                        }

                        
                        public String getType() {
                            return type;
                        }

                        
                        public void setType(String value) {
                            this.type = value;
                        }


                        
                        @XmlAccessorType(XmlAccessType.FIELD)
                        @XmlType(name = "", propOrder = {
                            "cashitem"
                        })
                        public static class States {

                            @XmlElement(required = true)
                            protected Universe.Cotest.Test.Country.States.Requirement.States.Cashitem cashitem;

                            
                            public Universe.Cotest.Test.Country.States.Requirement.States.Cashitem getCashitem() {
                                return cashitem;
                            }

                            
                            public void setCashitem(Universe.Cotest.Test.Country.States.Requirement.States.Cashitem value) {
                                this.cashitem = value;
                            }

                            @XmlAccessorType(XmlAccessType.FIELD)
                            @XmlType(name = "", propOrder = {
                                "currency",
                                "val"
                            })
                            public static class Cashitem {

                                @XmlElement(required = true)
                                protected String currency;
                                @XmlElement(required = true)
                                protected String val;

                                
                                public String getCurrency() {
                                    return currency;
                                }

                                
                                public void setCurrency(String value) {
                                    this.currency = value;
                                }

                                
                                public String getVal() {
                                    return val;
                                }

                               
                                public void setVal(String value) {
                                    this.val = value;
                                }

                            }

                        }

                    }

                }

            }

        }

    }

}

and this is objectfactory

package com.test1;

import javax.xml.bind.annotation.XmlRegistry;



@XmlRegistry
public class ObjectFactory {


    public ObjectFactory() {
    }
    public Universe createUniverse() {
        return new Universe();
    }

    public Universe.Cotest createUniverseCotest() {
        return new Universe.Cotest();
    }
    public Universe.Cotest.Test createUniverseCotestTest() {
        return new Universe.Cotest.Test();
    }
    public Universe.Cotest.Test.Country createUniverseCotestTestCountry() {
        return new Universe.Cotest.Test.Country();
    }
    public Universe.Cotest.Test.Country.States createUniverseCotestTestCountryStates() {
        return new Universe.Cotest.Test.Country.States();
    }
    public Universe.Cotest.Test.Country.States.Requirement createUniverseCotestTestCountryStatesRequirement() {
        return new Universe.Cotest.Test.Country.States.Requirement();
    }

    public Universe.Cotest.Test.Country.States.Requirement.States createUniverseCotestTestCountryStatesRequirementStates() {
        return new Universe.Cotest.Test.Country.States.Requirement.States();
    }
    public Universe.Cotest.Test.Country.States.Requirement.States.Cashitem createUniverseCotestTestCountryStatesRequirementStatesCashitem() {
        return new Universe.Cotest.Test.Country.States.Requirement.States.Cashitem();
    }

}

As you can see from the universe classs, there are 2 static inner classes public static class States and this is the issue.
Can you any please provide a solution?
Let me know if any more information required.

huangapple
  • 本文由 发表于 2020年4月9日 11:18:49
  • 转载请务必保留本文链接:https://java.coder-hub.com/61113409.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定