powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заставить JAXB выбрать нужный тип данных для enum?
13 сообщений из 13, страница 1 из 1
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789537
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В .xsd объявлен тип данных:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	<xs:simpleType name="UUID">
		<xs:annotation>
			<xs:appinfo>
				<jxb:javaType name="java.util.UUID" parseMethod="java.util.UUID.fromString"/>
			</xs:appinfo>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:whiteSpace value="preserve"/>
			<xs:pattern value="[0-9A-Fa-f]{8,8}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{12,12}"/>
		</xs:restriction>
	</xs:simpleType>


Когда использую этот тип при объявлении, допустим, атрибутов в complex type, то xjc это обрабатывает правильно - в java-классах генерит поля типа java.util.UUID. Но вот я объявляю в схеме перечисление на основе UUID:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	<xs:simpleType name="Kinds">
		<xs:restriction base="UUID">
			<xs:enumeration value="5F3D31C0-62BF-481C-BBC6-57DCDCE38702">
				<xs:annotation>
					<xs:appinfo>
						<jxb:typesafeEnumMember name="Kind1"/>
					</xs:appinfo>
				</xs:annotation>
			</xs:enumeration>
			<xs:enumeration value="7E8A8F86-BCBE-40B5-B47C-45C84CA12600">
				<xs:annotation>
					<xs:appinfo>
						<jxb:typesafeEnumMember name="Kind2"/>
					</xs:appinfo>
				</xs:annotation>
			</xs:enumeration>
		</xs:restriction>
	</xs:simpleType>


xjc мне генерит на это следующий java-код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
@XmlType(name = "Kinds")
@XmlEnum
public enum Kinds {

    @XmlEnumValue("5F3D31C0-62BF-481C-BBC6-57DCDCE38702")
    Kind1("5F3D31C0-62BF-481C-BBC6-57DCDCE38702"),
    @XmlEnumValue("7E8A8F86-BCBE-40B5-B47C-45C84CA12600")
    Kind2("7E8A8F86-BCBE-40B5-B47C-45C84CA12600");
    private final String value;

    Kinds(String v) {
        value = v;
    }

    public String value() {
        return value;
    }

    public static Kinds fromValue(String v) {
        for (Kinds c: Kinds.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }

}


А нужно, чтобы генерился код вида:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
@XmlType(name = "Kinds")
@XmlEnum
public enum Kinds {

    @XmlEnumValue("5F3D31C0-62BF-481C-BBC6-57DCDCE38702")
    Kind1("5F3D31C0-62BF-481C-BBC6-57DCDCE38702"),
    @XmlEnumValue("7E8A8F86-BCBE-40B5-B47C-45C84CA12600")
    Kind2("7E8A8F86-BCBE-40B5-B47C-45C84CA12600");
    private final UUID value;

    Kinds(String v) {
        value = UUID.fromString(v);
    }

    public UUID value() {
        return value;
    }

    public static Kinds fromValue(String v) {
        for (Kinds c: Kinds.values()) {
            if (c.value.equals(UUID.fromString(v))) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }

}


Что нужно написать в .xsd, чтобы добиться желаемого эффекта?
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789567
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия JAXB актуальная?
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789594
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

xjc -version выдаёт xjc 2.2.4-2
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789614
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gamych,

Руками поправить Enum не вариант?
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789650
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

К сожалению не вариант. Такого рода енумов много и будут ещё, а схемы дополняются по ходу пьесы, генерация исходников java запускается мавеновским плагином. Можно, конечно, включить в проект не схемы, а сгенерированные и поправленные руками исходники, но неохота потом следить за всем этим бардаком. Тем более, что не один я.
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789667
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gamychК сожалению не вариант. Такого рода енумов много и будут ещё, а схемы дополняются по ходу пьесы, генерация исходников java запускается мавеновским плагином. Можно, конечно, включить в проект не схемы, а сгенерированные и поправленные руками исходники, но неохота потом следить за всем этим бардаком. Тем более, что не один я.
Ну, мы у себя правим классы с которыми xjc не справился и комитим их в проект генерации.
Мавен сначала запускает xjc, потом копирует сверху измененные классы и потом уже компилирует.
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789686
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

В смысле? Файлы с исправленными классами лежат не в директории с исходниками, а в ресурсах, и в проекте указано, что эти файлы нужно скопировать в директорию с исходниками, взамен сгенерённых?
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789688
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gamychВ смысле? Файлы с исправленными классами лежат не в директории с исходниками, а в ресурсах, и в проекте указано, что эти файлы нужно скопировать в директорию с исходниками, взамен сгенерённых?
Да, типа того.
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789695
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Понятно. Тоже вариант, приму к сведению. Подожду пока идти по этому пути, может кто подскажет, как xjc заставить работать так, как мне надо.

Спасибо за совет.
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789718
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gamych,

С какой-то версии typesafeEnumClass должен поддерживать атрибут ref. Но у меня на Java 8 не завелось. :(
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789720
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczgamych,

С какой-то версии typesafeEnumClass должен поддерживать атрибут ref. Но у меня на Java 8 не завелось. :(
Не, не то. Это не внутренний тип, а ссылка на существующий класс, который реализует этот тип.
Тогда можно смело говорить о том что в JAXB такого не предусмотрено. Надо либо у вендоров смотреть, либо самому дописать.
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38789730
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gamych,

Можно попробовать взять MOXy. Там тип энума явно указывается в маппинге.
http://www.eclipse.org/eclipselink/documentation/2.4/moxy/simple_values004.htm
...
Рейтинг: 0 / 0
Как заставить JAXB выбрать нужный тип данных для enum?
    #38799214
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Не могу. Выбор средств разработки не от меня зависит.

Средствами xjc побороть не смог. Решил проблему следующим образом - исходники для нужных классов генерю xsl-скриптом, а в файле биндингов указываю, что эти классы не генерить, а брать готовые.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заставить JAXB выбрать нужный тип данных для enum?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]