Добавьте 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, которые должны адресовать то, что вы пытаетесь достичь:
Доступны и другие плагины, которые охватывают аналогичные общие аспекты 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 варианта реализации:
- Простая / стандартная реализация, такая как
equals( that )
метод (при использованииEquals Plugin
). - Более сложная реализация, которая включает
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:
- Добавить в pom.xml
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</dependency>
- Добавьте плагин
<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