Статьи

Поездка на верблюде на Java EE 7 – Службы REST с документацией Swagger

Верблюд поставляется с кучей функций из коробки. Одним из них является интеграция Swagger. К сожалению, большинство уже существующих функций сильно зависит от Spring. Но это не должно мешать нам использовать их в простых приложениях Java EE 7, потому что иногда это просто более легкий вариант ведения дел. Но я не хочу начинать обсуждение об этом снова. Вместо этого, я думаю, что есть выбор технологии для всех ситуаций, и если вы работаете над проектом, вы просто хотите использовать Camel с Java EE 7, вам нужны REST-сервисы и вы хотите документировать их с помощью Swagger, это правильный пост для вас. ,

Самозагрузка Camel в EE 7
Первое, что вам нужно, это загрузить верблюда в одиночный стартовый компонент. Я уже написал статью, о том, как это сделать, Другой вариант — использовать  подсистему верблюдов, которая также доступна, но для этого требуется, чтобы вы были на JBoss WildFly 8.x.

Зависимости Swagger и Camel от остальных
На сегодняшний день интеграция Swagger в Camel поддерживается только для приложений Spring. Итак, чтобы сделать это, нам нужно немного реализовать и настроить немного больше, чем обычно. Но я обещаю, что это не слишком сложно и сделано за минуту. Давайте начнем:
Первое, что нужно добавить к базовому примеру Camel EE 7 — это дополнительные зависимости для верблюда:

         <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-servlet</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-metrics</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-swagger</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jackson</artifactId>
        </dependency>

Возвращение контекста Camel для Swagger
Если мы не можем использовать то, что там есть, нам нужно реализовать наш собственный контекстный поиск CdiRestSwagger-Camel. Для будущих  версий Camel готовятся некоторые вещи  , но сейчас мы должны сделать это самостоятельно. Что удивительно просто, потому что нам нужно перезаписать один метод RestSwaggerApiDeclarationServlet. И это не что иное, как просто вернуть введенный CdiCamelContext.

public class CdiRestSwaggerApiDeclarationServlet extends RestSwaggerApiDeclarationServlet {

    @Inject
    CdiCamelContext context;

    @Override
    public CamelContext lookupCamelContext(ServletConfig config) {
        return context;
    }
}

Дальнейшая настройка
Мы еще не закончили. У вас еще есть несколько настроек, чтобы сделать. Поскольку Camel предназначен для работы во многих различных средах, а конкретной версии Java EE 7 не существует, он по-прежнему полагается на конфигурацию web.xml для сервлетов отображения. Обратите особое внимание на параметры инициализации CdiRestSwaggerApiDeclarationServlet. В этом простом примере я не удосужился их выяснить, но все же полагаюсь на них. Таким образом, в зависимости от конечного имени вашего приложения, которое вы задали в сборке Maven, это необходимо настроить.

 <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- to use Java DSL -->
        <param-value>classpath:camel-config.xml</param-value>
 </context-param>

    <!-- to setup Camel Servlet -->
    <servlet>
       <display-name>Camel Http Transport Servlet</display-name>
        <servlet-name>CamelServlet</servlet-name>
        <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet<load-on-startup>1</load-on-startup>
    </servlet>

    <!-- to setup Camel Swagger api servlet -->
    <servlet>
        <!-- we are using our own swagger-cdi binding servlet -->
        <servlet-class>org.apache.camel.component.swagger.CdiRestSwaggerApiDeclarationServlet
        <init-param>
            <param-name>base.path</param-name>
            <param-value>http://localhost:8080/camel/rest</param-value>
        </init-param>
        <init-param>
            <param-name>api.path</param-name>
            <param-value>         http://localhost:8080/camel/api-docs          </param-value>
        </init-param>
        <init-param>
            <param-name>api.version</param-name>
            <param-value>1.2.3</param-value>
        </init-param>
        <init-param>
            <param-name>api.title</param-name>
            <param-value>User Services</param-value>
        </init-param>
        <init-param>
            <param-name>api.description</param-name>
            <param-value>Camel Rest Example with Swagger that provides an User REST service</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <!-- swagger api declaration -->
    <servlet-mapping>
        <servlet-name>ApiDeclarationServlet</servlet-name>
        <url-pattern>/api-docs/*</url-pattern>
    </servlet-mapping>

    <!-- define that url path for the Camel Servlet to use -->
    <servlet-mapping>
        <servlet-name>CamelServlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <!-- enable CORS filter so people can use swagger ui to browse and test the apis -->
    <filter>
        <filter-name>RestSwaggerCorsFilter</filter-name>
        <filter-class>org.apache.camel.component.swagger.RestSwaggerCorsFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>RestSwaggerCorsFilter</filter-name>
        <url-pattern>/api-docs/*</url-pattern>
        <url-pattern>/rest/*</url-pattern>
    </filter-mapping>

Достаточно конфигурации — к логике!
Когда вы закончите с этим, вам нужна логика. Пример, который я здесь использую, взят из официальных примеров Camel и называется  camel-example-servlet-rest-tomcat . Обратите внимание, что этот пример содержит как определение XML-DSL, так и определение оставшейся службы на основе Java DSL. Я использовал только Java DSL и, в частности, маршрут, определенный в   классе UserRouteBuilder .
Обязательно добавьте аннотацию @Named к UserService и User и добавьте маршрут из UserRouteBuilder в ваш начальный компонент.

   context.addRoutes(new UserRouteBuilder());

Вот и все. Теперь вы можете просматривать свой API, перейдя по адресу http: // localhost: 8080 / camel / api-docs. Если вы хотите использовать Swagger UI, вы должны добавить его в свое приложение. Пример приложения содержит в разделе сборки все, что необходимо для этого. Итак, взгляните на  полный проект GitHub,  чтобы узнать, как просматривать API с помощью Swagger UI.