You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2016/02/16 18:02:04 UTC
cxf git commit: [CXF-5439, CXF-6779] Adding a CXF Provider annotation,
marking Swagger2Feature, updating Spring Boot demo
Repository: cxf
Updated Branches:
refs/heads/master d68286f71 -> 4946ee58a
[CXF-5439,CXF-6779] Adding a CXF Provider annotation, marking Swagger2Feature, updating Spring Boot demo
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/4946ee58
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/4946ee58
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/4946ee58
Branch: refs/heads/master
Commit: 4946ee58ae2e2a3ff81904ff08ed2032048cdbc7
Parents: d68286f
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Tue Feb 16 17:01:48 2016 +0000
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Tue Feb 16 17:01:48 2016 +0000
----------------------------------------------------------------------
.../org/apache/cxf/annotations/Provider.java | 34 +++++++++++
.../samples/jax_rs/jaxrs_spring_boot/pom.xml | 19 +++++--
.../java/sample/rs/service/HelloService.java | 4 +-
.../rs/service/SampleScanRestApplication.java | 13 +++--
.../AbstractSpringComponentScanServer.java | 60 ++++++++++++++++++--
.../AbstractSpringConfigurationFactory.java | 2 +-
.../cxf/jaxrs/swagger/Swagger2Feature.java | 3 +
7 files changed, 119 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/4946ee58/core/src/main/java/org/apache/cxf/annotations/Provider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/annotations/Provider.java b/core/src/main/java/org/apache/cxf/annotations/Provider.java
new file mode 100644
index 0000000..4bf751e
--- /dev/null
+++ b/core/src/main/java/org/apache/cxf/annotations/Provider.java
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Provider {
+ enum Type { InInterceptor, OutInterceptor, InFaultInterceptor, OutFaultInterceptor, Feature }
+ enum Scope { Server, Client, All }
+
+ Type value();
+ Scope scope() default Scope.All;
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/4946ee58/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/pom.xml
----------------------------------------------------------------------
diff --git a/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/pom.xml b/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/pom.xml
index e9cbd7c..acfbcbc 100644
--- a/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/pom.xml
+++ b/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/pom.xml
@@ -46,18 +46,27 @@
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
- <dependency>
+ <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-service-description</artifactId>
<version>${cxf.version}</version>
</dependency>
-
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-jaxrs</artifactId>
+ <version>1.5.4</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>jsr311-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.3.RELEASE</version>
</dependency>
-
</dependencies>
<build>
<plugins>
@@ -65,9 +74,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
- <mainClass>sample.rs.service.SampleRestApplication</mainClass>
<!--
+ <mainClass>sample.rs.service.SampleRestApplication</mainClass>
+ -->
<mainClass>sample.rs.service.SampleScanRestApplication</mainClass>
+ <!--
<mainClass>sample.rs.service.SampleScanRestApplication2</mainClass>
-->
</configuration>
http://git-wip-us.apache.org/repos/asf/cxf/blob/4946ee58/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/HelloService.java
----------------------------------------------------------------------
diff --git a/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/HelloService.java b/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/HelloService.java
index 6bf34ed..beef6f5 100644
--- a/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/HelloService.java
+++ b/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/HelloService.java
@@ -22,8 +22,10 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
+import org.springframework.stereotype.Service;
@Path("/sayHello")
+@Service
public class HelloService {
@GET
@@ -33,4 +35,4 @@ public class HelloService {
return "Hello " + a + ", Welcome to CXF RS Spring Boot World!!!";
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/4946ee58/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/SampleScanRestApplication.java
----------------------------------------------------------------------
diff --git a/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/SampleScanRestApplication.java b/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/SampleScanRestApplication.java
index c7643b2..5be53a8 100644
--- a/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/SampleScanRestApplication.java
+++ b/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot/src/main/java/sample/rs/service/SampleScanRestApplication.java
@@ -18,6 +18,7 @@
*/
package sample.rs.service;
import org.apache.cxf.jaxrs.spring.SpringComponentScanServer;
+import org.apache.cxf.jaxrs.swagger.Swagger2Feature;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -37,11 +38,13 @@ public class SampleScanRestApplication {
public ServletRegistrationBean servletRegistrationBean(ApplicationContext context) {
return new ServletRegistrationBean(new CXFServlet(), "/services/helloservice/*");
}
-
-
@Bean
- public HelloService helloService() {
- return new HelloService();
+ public Swagger2Feature swaggerFeature(ApplicationContext context) {
+ // Or create a simple Swagger2Feature @Component-annotated extension
+ // and drop this method if a default feature setup is OK
+ Swagger2Feature feature = new Swagger2Feature();
+ feature.setRunAsFilter(true);
+ return feature;
}
-
+
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/4946ee58/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java
index 31284aa..927c5e2 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringComponentScanServer.java
@@ -25,18 +25,28 @@ import java.util.List;
import javax.ws.rs.Path;
import javax.ws.rs.ext.Provider;
+import org.apache.cxf.annotations.Provider.Scope;
+import org.apache.cxf.feature.Feature;
+import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.message.Message;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
@ComponentScan(
- includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Path.class, Provider.class })
+ includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,
+ value = {Path.class,
+ Provider.class,
+ org.apache.cxf.annotations.Provider.class})
)
public abstract class AbstractSpringComponentScanServer extends AbstractSpringConfigurationFactory {
private List<ResourceProvider> resourceProviders = new LinkedList<ResourceProvider>();
private List<Object> jaxrsProviders = new LinkedList<Object>();
+ private List<Feature> cxfFeatures = new LinkedList<Feature>();
+ private List<Interceptor<? extends Message>> cxfInInterceptors = new LinkedList<Interceptor<?>>();
+ private List<Interceptor<? extends Message>> cxfOutInterceptors = new LinkedList<Interceptor<?>>();
private Class<? extends Annotation> serviceAnnotation;
protected AbstractSpringComponentScanServer() {
@@ -46,28 +56,58 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
}
protected void setJaxrsResources(JAXRSServerFactoryBean factory) {
boolean checkJaxrsRoots = checkJaxrsRoots();
- boolean checkJaxrsProviders = checkJaxrsProviders();
+ boolean checkJaxrsProviders = checkJaxrsProviders();
+ boolean checkCxfProviders = checkCxfProviders();
for (String beanName : applicationContext.getBeanDefinitionNames()) {
if (checkJaxrsRoots && isAnnotationAvailable(beanName, Path.class)
- && (serviceAnnotation == null || isAnnotationAvailable(beanName, serviceAnnotation))) {
+ && matchesServiceAnnotation(beanName)) {
SpringResourceFactory resourceFactory = new SpringResourceFactory(beanName);
resourceFactory.setApplicationContext(applicationContext);
resourceProviders.add(resourceFactory);
} else if (checkJaxrsProviders && isAnnotationAvailable(beanName, Provider.class)
- && (serviceAnnotation == null || isAnnotationAvailable(beanName, serviceAnnotation))) {
+ && matchesServiceAnnotation(beanName)) {
jaxrsProviders.add(applicationContext.getBean(beanName));
+ } else if (checkCxfProviders && isAnnotationAvailable(beanName,
+ org.apache.cxf.annotations.Provider.class) && matchesServiceAnnotation(beanName)) {
+ addCxfProvider(applicationContext.getBean(beanName));
}
}
factory.setResourceProviders(getResourceProviders());
factory.setProviders(getJaxrsProviders());
+ factory.setFeatures(getFeatures());
+ factory.setInInterceptors(getInInterceptors());
+ factory.setOutInterceptors(getOutInterceptors());
+
}
+ protected void addCxfProvider(Object bean) {
+ org.apache.cxf.annotations.Provider ann =
+ bean.getClass().getAnnotation(org.apache.cxf.annotations.Provider.class);
+ if (ann.scope() == Scope.Client) {
+ return;
+ }
+ if (ann.value() == org.apache.cxf.annotations.Provider.Type.Feature) {
+ cxfFeatures.add((Feature)bean);
+ } else if (ann.value() == org.apache.cxf.annotations.Provider.Type.InInterceptor) {
+ cxfInInterceptors.add((Interceptor<?>)bean);
+ } else if (ann.value() == org.apache.cxf.annotations.Provider.Type.OutInterceptor) {
+ cxfOutInterceptors.add((Interceptor<?>)bean);
+ }
+
+ }
+ protected boolean matchesServiceAnnotation(String beanName) {
+ return serviceAnnotation == null || isAnnotationAvailable(beanName, serviceAnnotation);
+ }
protected <A extends Annotation> boolean isAnnotationAvailable(String beanName, Class<A> annClass) {
return applicationContext.findAnnotationOnBean(beanName, annClass) != null;
}
+ protected boolean checkCxfProviders() {
+ return true;
+ }
+
protected boolean checkJaxrsProviders() {
return true;
}
@@ -83,6 +123,16 @@ public abstract class AbstractSpringComponentScanServer extends AbstractSpringCo
protected List<Object> getJaxrsProviders() {
return jaxrsProviders;
}
-
+ @Override
+ public List<Feature> getFeatures() {
+ return cxfFeatures;
+ }
+ @Override
+ public List<Interceptor<? extends Message>> getInInterceptors() {
+ return cxfInInterceptors;
+ }
+ public List<Interceptor<? extends Message>> getOutInterceptors() {
+ return cxfOutInterceptors;
+ }
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/4946ee58/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java
index 1ee09fa..bf37436 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/AbstractSpringConfigurationFactory.java
@@ -65,7 +65,7 @@ public abstract class AbstractSpringConfigurationFactory
return Collections.emptyList();
}
- protected List<Feature> getFeatures() {
+ public List<Feature> getFeatures() {
return Collections.emptyList();
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/4946ee58/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
----------------------------------------------------------------------
diff --git a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
index da84457..5072104 100644
--- a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
+++ b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
@@ -35,6 +35,8 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
+import org.apache.cxf.annotations.Provider;
+import org.apache.cxf.annotations.Provider.Type;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
@@ -50,6 +52,7 @@ import io.swagger.jaxrs.config.DefaultReaderConfig;
import io.swagger.jaxrs.config.ReaderConfig;
import io.swagger.jaxrs.listing.ApiListingResource;
+@Provider(Type.Feature)
public class Swagger2Feature extends AbstractSwaggerFeature {
private String host;