Добавьте toString, hashCode, equals при создании классов JAXB в Java

Я пытаюсь генерировать классы JAXB из файла XSD программно, используя Java. Для этого я использовал следующий фрагмент кода:

....
import java.io.File;
import java.io.IOException;
import org.xml.sax.InputSource;
import com.sun.codemodel.JCodeModel;
import com.sun.tools.xjc.api.S2JJAXBModel;
import com.sun.tools.xjc.api.SchemaCompiler;
import com.sun.tools.xjc.api.XJC;
....
....
public static void generateJaxb(String schemaPath,
                                    String outputDirectory,
                                        String packageName) throws DataLoadingException
{
    try {
        // Setup schema compiler
        SchemaCompiler sc = XJC.createSchemaCompiler();
        sc.forcePackageName(packageName);

        // Setup SAX InputSource
        File schemaFile = new File(schemaPath);
        InputSource is = new InputSource(schemaFile.toURI().toString());

        // Parse & build
        sc.parseSchema(is);
        S2JJAXBModel model = sc.bind();

        JCodeModel jCodeModel = model.generateCode(null, null);
        jCodeModel.build(new File(outputDirectory));
    } catch (IOException exec) {
        LOGGER.error("Error while generating JAXB classes: " + exec);
    }
}

Сгенерированные классы содержат только getter методы для полей. Но я хочу включить hashCode, equals а также setter методы также. Как это сделать при генерации кода?

2 ответа

Решение

На веб-сайте Java.net вы найдете проект JAXB 2.x Commons, который предоставляет общий набор JAXB служебные плагины, в том числе 4, которые должны адресовать то, что вы пытаетесь достичь:

  1. Плагин Equals
  2. Плагин HashCode
  3. Сеттерс плагин
  4. Плагин ToString

Доступны и другие плагины, которые охватывают аналогичные общие аспекты Java доменные объекты.

конфигурация

Из XML Schema В перспективе конфигурации вы добавите ссылки, как показано здесь:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:basic="http://jaxb2-commons.dev.java.net/basic"
    xmlns:equals="http://jaxb2-commons.dev.java.net/basic/equals"
    xmlns:hashCode="http://jaxb2-commons.dev.java.net/basic/hashCode"
    xmlns:toString="http://jaxb2-commons.dev.java.net/basic/toString"
    jaxb:extensionBindingPrefixes="basic equals hashCode toString">
    <!-- ... -->
</xs:schema>

Доступны дополнительные параметры, такие как определение свойств объекта, которые следует игнорировать при создании equals( that ) реализация, toString() реализация и т. д.

Генерация Java-кода

Из Java В перспективе плагины обычно имеют сгенерированные классы, реализующие interface; В качестве примера, сгенерированные классы, которые включают в себя equals( that ) Реализация будет реализовывать интерфейс Equals.

Подход дизайна, используемый плагинами, обычно генерирует 2 варианта реализации:

  1. Простая / стандартная реализация, такая как equals( that ) метод (при использовании Equals Plugin).
  2. Более сложная реализация, которая включает locator а также strategy параметры, которые позволяют вам реализовать пользовательскую обработку (если хотите). Для них вы увидите сигнатуру метода, такую ​​как: equals( thisLocator, thatLocator, that, strategy),

Сборка / Время воспроизведения

С точки зрения времени выполнения, вы должны включить JAXB2 Basics Runtime jar и предоставить такие параметры параметров, как: -Xequals, -XhashCode, или же -XtoString, Приведены примеры использования Основ JAXB2 из Ant а также MavenЕсли вы используете какой-либо из них для выполнения сборок, и более подробная информация о сборке приведена в Руководстве пользователя JAXB2 Основы.

Обновление Ответ ниже является неправильным. Я был введен в заблуждение интерфейсом, generateCode на самом деле ничего не делает с плагинами в данный момент. Как отметил @Sidola, вы должны использовать SchemaCompiler вместо.

В дополнение к ответу @SeanMickey я расскажу о генерации кода.

  • Добавьте JAR-файлы JAXB2-Basics в свой путь к классам.
  • иллюстрировать примерами
    • org.jvnet.jaxb2_commons.plugin.tostring.ToStringPlugin
    • org.jvnet.jaxb2_commons.plugin.equals.EqualsPlugin
    • org.jvnet.jaxb2_commons.plugin.hashcode.HashCodePlugin
    • org.jvnet.jaxb2_commons.plugin.setters.SettersPlugin
  • ... или что вам нужно.
  • Передать плагины в model.generateCode(plugins errorListener) в качестве первого параметра.

Кстати, почему вы хотите генерировать код программно?

Для меня самый простой способ сделать это - использовать JAXB2 Basics Plugins:

  1. Добавить в pom.xml <dependencies>
<dependency> 
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics</artifactId>
    <version>0.11.1</version>
</dependency>
  1. Добавьте плагин
<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.14.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <schemaDirectory>src/main/resources</schemaDirectory>
                <generateDirectory>target/generated-sources</generateDirectory>
                <generatePackage>my.package</generatePackage>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <extension>true</extension>
        <args>
            <arg>-XtoString</arg>
            <arg>-Xequals</arg>
            <arg>-XhashCode</arg>
        </args>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-basics</artifactId>
                <version>0.11.1</version>
            </plugin>
        </plugins>
    </configuration>
</plugin>

Soure: https://github.com/highsource/jaxb2-basics/wiki/Using-JAXB2-Basics-Plugins

Другие вопросы по тегам