maven-pluginjsonix

Generate JSON Schema as several files using Jsonix


I have several XSD files, separated by requests and subjects, however the JSON Schema that I get as an output is one big file with thousands of lines. I would like to know if there is a setting to output the generated JSON Schema as several files using Jsonix. It would be easier to navigate in.

Below is the Jsonix part of my pom.xml:

    <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.13.3</version>
        <executions>
            <execution>
                <goals>
                    <goal>generate</goal>
                </goals>
                <configuration>

                    <extension>true</extension>
                    <args>
                        <arg>-Xannotate</arg>
                        <arg>-Xjsonix</arg>
                        <arg>-Xjsonix-generateJsonSchema</arg>  
                    </args>
                    <plugins>
                        <plugin>
                            <groupId>org.hisrc.jsonix</groupId>
                            <artifactId>jsonix-schema-compiler</artifactId>
                            <version>2.3.10</version>
                        </plugin>

                        <plugin>
                            <groupId>org.jvnet.jaxb2_commons</groupId>
                            <artifactId>jaxb2-basics-annotate</artifactId>
                            <version>1.0.2</version>
                        </plugin>
                        <plugin>
                            <groupId>org.jvnet.jaxb2_commons</groupId>
                            <artifactId>jaxb2-annotate-plugin-test-annox-annotations</artifactId>
                            <version>1.0.0</version>
                        </plugin>
                        <plugin>
                            <groupId>io.swagger</groupId>
                            <artifactId>swagger-annotations</artifactId>
                            <version>1.5.10</version>
                        </plugin>
                    </plugins>


                    <schemaDirectory>src/main/resources</schemaDirectory>
                    <schemaIncludes>
                        <include>**/*.xsd</include>
                    </schemaIncludes>

                    <bindingDirectory>src/main/resources</bindingDirectory>
                    <bindingIncludes>
                        <include>**/*.xjb</include>
                    </bindingIncludes>

                    <generatePackage>com.my.awesome.package</generatePackage>
                    <generateDirectory>${project.build.directory}/generated-sources/jsonSchema</generateDirectory>

                    <verbose>true</verbose>

                </configuration>
            </execution>
        </executions>
    </plugin>

Solution

  • Author of Jsonix here.

    I would like to know if there is a setting to output the generated JSON Schema as several files using Jsonix.

    Yes, please read about modules and mappings.

    In short a mapping more-or-less corresponds to one package in Java. A module is a collection of one or more mappings, is also a unit of generation.

    You can configure the compiler to generate modules containing specific mappings.

    If I understand your case correctly, you have a large schema and you'd like to divide mappings or JSON schemas into several files.

    Here's how I'd approach it.

    I have to say I haven't really tried it in this scenario. Normally people do the opposite thing - group several mappings in one module. But I see no reason for this not to work.

    An example configuration might look something like:

    <jsonix:module
      name="MyRequests">
      <jsonix:mapping package="com.my.awesome.package" name="MyRequests">
        <jsonix:includes>
          <jsonix:type name="MyRequestType"/>
          ...
        </jsonix:includes>
      <jsonix:mapping>
    </jsonix:module>
    <jsonix:module
      name="MyResponses">
      <jsonix:mapping package="com.my.awesome.package" name="MyResponses">
        <jsonix:includes>
          <jsonix:type name="MyResponseType"/>
          ...
        </jsonix:includes>
      <jsonix:mapping>
    </jsonix:module>
    

    I'm not 100% sure this will work, but this is a good starting point.