Проблемы с WADL / сгенерированным XSD при использовании Джерси с подходом сначала контракта
Я работаю над веб-сервисом REST с использованием Jersey уже несколько дней, и мне удалось запустить все операции CRUD с несколькими форматами обмена: XML, JSON, Google Protobuf.
Однако я сталкиваюсь с некоторыми проблемами, связанными с автоматически генерируемыми WADL и XSD.
контекст
Чтобы определить объекты, которыми обмениваются эти три формата, я следовал подходу "сначала контракт":
- из XSD, который я написал, я сгенерировал свои классы моделей, используя JAXB;
- из написанного мной эквивалентного файла прото я сгенерировал классы Google Protobuf (и внутренне у меня есть способ преобразовать их в сгенерированные JAXB объекты, чтобы получить одну уникальную модель).
Однако, поскольку я хотел бы, чтобы мои пользователи также могли генерировать свои классы, я хотел бы поделиться этими файлами схемы (.xsd и.proto) и обеспечить их хорошую интеграцию с автоматически сгенерированным WADL.
Для этого, благодаря этой вики-странице:
- Я выставил два файла под
/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
ударил? (Я гуглил и нашел WadlResource для создания настраиваемого WADL, но ничего не нашел в самом поколении XSD)
Заранее спасибо за помощь!
М.
редактировать
1) Я поднял вопрос перед командой Джерси и получил ответ: http://java.net/projects/jersey/lists/users/archive/2012-06/message/8
2) Я поднял билет (ДЖЕРСИ-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.