Apache CXF JAX-RS服务器使用Swagger 2.0从API规格生成,我需要添加什么才能使此工作



我已经使用Swagger 2.0规范生成了Apache CXF JAX-RS REST API服务器端代码,因此使用CXF版本3.1.8依赖项创建。我想了解如何使REST应用程序服务器运行(独立的Jetty或Spring Boot或Tomcat)是什么。我专门寻找涉及的Maven依赖性 我需要添加的配置。我发现很难从可用文档中收集正确的详细信息,这是简短的。

我尝试按照CXF样本进行操作,但继续遇到问题:

Mar 07, 2017 4:57:53 PM org.apache.cxf.jaxrs.utils.JAXRSUtils readFromMessageBody
WARNING: No message body reader has been found for request class ABC, ContentType : application/json.
Mar 07, 2017 4:57:53 PM org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
WARNING: WebApplicationException has been caught : no cause is available

我发现由于招摇的参与,很难理解依赖关系。示例代码可以正常工作,但与摇摇欲坠生成的代码无效,当我使用它时,它给出了以上的例外。

我想了解下一步,如果有人用招摇完成的任何人都可以帮助您。

谢谢!

No message body reader has been found通常在您没有注册的提供商时发生。

@Bean
public JacksonJsonProvider jacksonJsonProvider(){
    return new JacksonJsonProvider();
}

这是带有Swagger2的CXF的完整春季启动配置。

使用CXF相关依赖项

更新了pom.xml
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
            <version>3.1.10</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.8.7</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.1.1-1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-service-description</artifactId>
            <version>3.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.webjars.bower</groupId>
            <artifactId>angular-swagger-ui</artifactId>
            <version>0.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>webjars-locator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.3.7</version>
        </dependency>
        <dependency>
            <groupId>org.webjars.bower</groupId>
            <artifactId>bootstrap-less-only</artifactId>
            <version>3.3.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-service-description-swagger</artifactId>
            <version>3.1.10</version>
        </dependency>

注意:由于我使用的是Angular-Swagger-UI添加了其他依赖关系

配置CXF bean。

@Configuration
public class CxfConfig {
    @Bean
    public Swagger2Feature swagger2Feature(){
        Swagger2Feature feature = new Swagger2Feature();
        feature.setPrettyPrint(true);
        feature.setUsePathBasedConfig(true);
        feature.setScan(false);
        feature.setBasePath("/swagger");
        return feature;
    }
    @Bean
    public JacksonJsonProvider jacksonJsonProvider(){
        return new JacksonJsonProvider();
    }
}

启用CXF组件自动扫描。

cxf.jaxrs.component-scan=true

创建html文件apidoc.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
<link rel="stylesheet" href="/webjars/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet"
    href="/webjars/angular-swagger-ui/dist/css/swagger-ui.min.css">
<script src="/webjars/angular/angular.min.js"></script>
<script src="/webjars/angular-swagger-ui/dist/scripts/swagger-ui.min.js"></script>
<script src="/webjars/angular-sanitize/angular-sanitize.min.js"></script>
<script src="/webjars/jquery/jquery.min.js"></script>
<script src="/webjars/bootstrap/js/bootstrap.min.js"></script>
<script src="js/cxf.js"></script>
</head>
<body ng-app="cxfApp" ng-controller="cxfCtrl" >
    <div swagger-ui url="cxfUrl" api-explorer="true" validator-url="false"></div>
</body>
</html>

在cxf.js

中启用Angular-Swggaer
angular.module('cxfApp', ['ngSanitize', 'swaggerUi']).controller("cxfCtrl", function($scope) {
    $scope.cxfUrl = '/services/swagger.json';
})

现在开始启动Spring-Boot应用程序。验证以下内容。

http://localhost:8080/services?_wadl
wadl文件
http://localhost:8080/services/swagger.json
对于Swagger JSON文件
http://localhost:8080/.html
对于Angular-Swagger-UI

春季启动应用程序

@ComponentScan("com.example")
@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class})
@SpringBootApplication
public class SpringBootCXFServer {
    @Autowired
    private Bus bus;
    public static void main(String[] args) {
        SpringApplication.run(SpringBootCXFServer.class, args);
    }
    @Bean
    public Server rsServer() {
        JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();
        endpoint.setBus(bus);
        endpoint.setServiceBeans(
                Arrays.<Object>asList(new DevicesLoggersApiServiceImpl(), new DevicesLoggersEntriesApiServiceImpl()));
        endpoint.setAddress("/services/");
        endpoint.setFeatures(Arrays.asList(new Swagger2Feature()));
        return endpoint.create();
    }
    @Bean
    @ConditionalOnMissingBean
    public JacksonJsonProvider jsonProvider(ObjectMapper objectMapper) {
        JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
        provider.setMapper(objectMapper);
        return provider;
}
}

和pom.xml:

<!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.8.RELEASE</version>
    </parent>

    <!-- <dependencyManagement> <dependencies> <dependency> Import dependency 
        management from Spring Boot <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> 
        <version>1.5.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> 
        </dependencies> </dependencyManagement> -->
    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.9.1</version>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>src/gen/java</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- build WAR file -->
            <!-- <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> 
                <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> 
                </plugin> -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
                <configuration>
                    <mainClass>com.example.Main</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
<dependencies>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
    <version>1.3.8.RELEASE</version>
</dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.all.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j <dependency> 
            <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>${slf4j.all.version}</version> 
            </dependency> -->
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.1</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-jaxrs</artifactId>
            <scope>compile</scope>
            <version>${swagger-core-version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit-version}</version>
            <scope>test</scope>
        </dependency>
        <!-- Bean Validation API support -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>${beanvalidation-version}</version>
            <scope>provided</scope>
        </dependency>
        <!-- CXF Client -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-client</artifactId>
            <version>${cxf-version}</version>
            <scope>test</scope>
        </dependency>
        <!-- CXF server -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>${cxf-version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-service-description</artifactId>
            <version>${cxf-version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-service-description-swagger</artifactId>
            <version>${cxf-version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-ws-policy</artifactId>
            <version>${cxf-version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-wsdl</artifactId>
            <version>${cxf-version}</version>
            <scope>compile</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider -->
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.8.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
            <version>3.1.10</version>
        </dependency>
    </dependencies>

最新更新