Подтвердить что ты не робот

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

4b9b3361

Ответ 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.