Я работаю над веб-сервисом 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), согласно инструкциям Павла. Я в настоящее время слежу за тем, чтобы либо отправить исправление самостоятельно, либо получить исправление от команды Джерси.