Проблемы с 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

в настоящее время конфликтуют (два определения для одних и тех же объектов).


Вопросы

  1. Есть ли способ отключить генерацию и распространение этого автоматически сгенерированного XSD? (Поскольку мне это не нужно, так как я следую этому подходу "сначала контракт")

  2. Если нет, то есть ли способ "переопределить" его содержимое с помощью моего 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.

Другие вопросы по тегам