首页 > 解决方案 > 如何使用camel-swagger-java和camel-servlet构建war文件

问题描述

我使用camel Rest DSL、camel-swagger-java 和camel-servlet 组件创建了一个rest 服务,然后打包成一个war 文件并部署到wildfly-11.0.0.Final,但出现以下异常:

Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: java.lang.ClassNotFoundException: org.jboss.weld.environment.servlet.Listener from [Module \"deployment.camelSample-0.0.1-SNAPSHOT.war\" from Service Module Loader]

有没有办法用camel-swagger-java和camel-servlet构建一个可以成功部署在wildfly-11.0.0.Final上的war文件?期待您的回答。提前致谢。

pom.xml

<dependencies>
    <!-- CDI API -->
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency>

    <!-- Camel -->
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-cdi</artifactId>
        <version>2.22.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-swagger-java</artifactId>
        <version>2.22.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-servlet</artifactId>
        <version>2.22.0</version>
        <scope>runtime</scope>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-logging-juli</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- JSON support -->
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-jackson</artifactId>
        <version>2.22.0</version>
    </dependency>
</dependencies>

web.xml

<listener>
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>

<servlet>
    <servlet-name>CamelServlet</servlet-name>
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>CamelServlet</servlet-name>
    <url-pattern>/camel/*</url-pattern>
</servlet-mapping>



<servlet>
    <servlet-name>SwaggerServlet</servlet-name>
    <servlet-class>org.apache.camel.swagger.servlet.RestSwaggerServlet</servlet-class>

    <init-param>
        <param-name>base.path</param-name>
        <param-value>rest</param-value>
    </init-param>
    <init-param>
        <param-name>api.path</param-name>
        <param-value>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>1</load-on-startup>
</servlet>

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

UserRestRoute.java

公共类 UserRestRoute 扩展 RouteBuilder {

@Override
public void configure() {

    rest("/user").description("User rest service")
        .consumes("application/json").produces("application/json")

        .get("/{id}").description("Find user by id").outType(User.class)
            .param().name("id").type(path).description("The id of the user to get").dataType("integer").endParam()
            .responseMessage().code(200).message("The user").endResponseMessage()
            .to("bean:userService?method=getUser(${header.id})");
}

}

标签: apache-camel

解决方案


您应该从 web.xml 中删除侦听器声明:

<listener>
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>

它只对 Tomcat、Jetty 等普通 Servlet 容器真正有用。WildFly 已经为您提供了 Weld 和 CDI 集成。


推荐阅读