How generate XMLElementWrapper annotation with xjc and customized binding

前端 未结 2 1830
无人共我
无人共我 2020-12-01 05:58

I\'m using JAXB and xjc to compile my XML Schema into Java classes. I do not want to manually edit this generated classes. I have xml schema like that:



        
相关标签:
2条回答
  • 2020-12-01 06:22

    First lets break up your schema so that there are no inner classes generated:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">
        <xs:element name="root" type="Root" />
    
        <xs:complexType name="Root">
            <xs:sequence>
                <xs:element name="items" type="Items" />
            </xs:sequence>
        </xs:complexType>
    
        <xs:complexType name="Items">
            <xs:sequence>
                <xs:element name="item" type="xs:string" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:schema>
    

    You'll still get extra classes, just not all in one file. Now you want to add a section to your build to use the jaxb-xew-plugin. I use Maven, so for me this looks like:

    <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.8.2</version>
        <executions>
            <execution>
                <goals>
                    <goal>generate</goal>
                </goals>
                <configuration>
                    <args>
                        <arg>-no-header</arg>
                        <arg>-Xxew</arg>
                        <arg>-Xxew:instantiate lazy</arg>
                        <arg>-Xxew:delete</arg>
                    </args>
                    <plugins>
                        <plugin>
                            <groupId>com.github.jaxb-xew-plugin</groupId>
                            <artifactId>jaxb-xew-plugin</artifactId>
                            <version>1.0</version>
                        </plugin>
                    </plugins>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    If you start using namespaces so that your generated classes have package names, leave off the -Xxew:delete flag, as there's a bug that I recently fixed where it was deleting objects it shouldn't. Alternatively, you could grab the code from github and use it as 1.1-SNAPSHOT.

    When I do that I get the code generated that I think you're looking for:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Root", propOrder = {
        "items"
    })
    public class Root {
    
        @XmlElementWrapper(name = "items", required = true)
        @XmlElement(name = "item")
        protected List<String> items;
    
        public List<String> getItems() {
            if (items == null) {
                items = new ArrayList<String>();
            }
            return items;
        }
    
        public void setItems(List<String> items) {
            this.items = items;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-01 06:32

    Bjarne Hansen developed a plugin for xjc that was able to take care of this. Unfortunately, the link to the original implementation is now dead. However, there is a project by Dmitry Katsubo on github, based on Bjarne's original code with some additional improvements.

    → https://github.com/dmak/jaxb-xew-plugin


    (Just for reference: the original link, now dead: http://www.conspicio.dk/blog/bjarne/jaxb-xmlelementwrapper-plugin)

    0 讨论(0)
提交回复
热议问题