Проблемы с WADL/сгенерированным XSD с использованием трикотажа с контрактом-первым подходом
Я работаю над веб-сервисом REST с помощью Jersey в течение нескольких дней, и мне удалось работать с CRUD-операциями с несколькими форматами обмена: XML, JSON, Google Protobuf.
Однако я столкнулся с некоторыми проблемами, связанными с автоматически генерируемыми WADL и XSD.
Контекст
Чтобы определить объекты, обмениваемые в этих трех форматах, я выполнил "контракт-первый" подход:
- из XSD, который я написал, я сгенерировал классы модели, используя JAXB;
- из эквивалентного файла proto, который я написал, я сгенерировал классы Google Protobuf (и внутренне имел способ преобразовать их в объекты, созданные JAXB, чтобы иметь одну уникальную модель).
Однако, поскольку я хотел бы, чтобы мои пользователи могли генерировать свои классы, я хотел бы поделиться этими файлами схемы (.xsd и .proto) и сделать их хорошо интегрированными с автоматически созданным WADL.
Для этой цели благодаря этой странице wiki:
- Я выставил два файла под
-
/schema/schema.xsd
-
/schema/schema.proto
-
Я добавил файл приложения-грамматики:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grammars xmlns="http://wadl.dev.java.net/2009/02"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xi="http://www.w3.org/1999/XML/xinclude">
<include href="../schema/schema.xsd" />
</grammars>
-
Я добавил настроенный генератор WADL:
public class RichWadlGeneratorConfig extends WadlGeneratorConfig {
@Override
public List<WadlGeneratorDescription> configure() {
return generator(WadlGeneratorApplicationDoc.class)
.prop("applicationDocsStream", "application-doc.xml")
.generator(WadlGeneratorGrammarsSupport.class)
.prop("grammarsStream", "application-grammars.xml")
.descriptions();
}
}
Таким образом, в WADL появляется ниже, когда я нажимаю /rest/application.wadl
:
<grammars>
<include href="../schema/schema.xsd"/>
<include href="application.wadl/xsd0.xsd">
<doc title="Generated" xml:lang="en"/>
</include>
</grammars>
Проблема
/rest/application.wadl/xsd0.xsd
автоматически генерируется из моих классов, но довольно отличается от того, что я изначально имел в schema.xsd
.
В дополнение к этому вызов такого типа, как wadl2java
на этом WADL, терпит неудачу, предположительно потому, что
-
/schema/schema.xsd
и
-
/rest/application.wadl/xsd0.xsd
теперь конфликтуют (два определения для тех же объектов).
Вопросы
-
Есть ли способ отключить генерацию и распространение этого автоматически созданного XSD?
(Так как мне это не нужно, поскольку я следую этому подходу "контракт-первый" )
-
Если нет, есть ли способ "переопределить" его содержимое с помощью написанного вручную XSD при ударе /rest/application.wadl/xsd0.xsd
?
(Я googled вокруг и нашел о WadlResource, чтобы создать настраиваемый WADL, но ничего не нашел о генерации XSD)
Заранее благодарим за помощь!
М.
Изменить
1) Я поднял вопрос до команды Джерси и получил ответ:
http://java.net/projects/jersey/lists/users/archive/2012-06/message/8
2) Я поднял билет (JERSEY-1230), согласно инструкциям Павла.
Я в настоящее время слежу за тем, чтобы либо отправить исправление самостоятельно, либо получить исправление от команды Джерси.
Ответы
Ответ 1
1.14-SNAPSHOT должно позволить вам сделать это:
public class SampleWadlGeneratorConfig extends WadlGeneratorConfig {
@Override
public List<WadlGeneratorDescription> configure() {
return generator( WadlGeneratorApplicationDoc.class )
.prop( "applicationDocsStream", "application-doc.xml" )
.generator( WadlGeneratorGrammarsSupport.class )
.prop( "grammarsStream", "application-grammars.xml" )
.prop("overrideGrammars", true) // !!!
.generator( WadlGeneratorResourceDocSupport.class )
.prop( "resourceDocStream", "resourcedoc.xml" )
.descriptions();
}
}
когда для overrideGrammars установлено значение true, созданные грамматики Джерси не будут включены в возвращенный WADL.