Now lets do the same for Client code to create i.e. we can create the client code i.e Feign , RestTemplate or httpclient. We will try with RestTemplate.
This time we will take the json or yaml file directly from the Server exposing out REST API and then we will create a Feign client that will consume that *.YAML files function and will call directly live server to give the reply.
1-First we will have our own Springboot project that will exposed JSON or YAML Open API 3.0 Version docs. Let say this are exposed on port 8080.
https://github.com/shdhumale/simple-springboot-swagger.git
2- We will create a finge client that will consumer the above SON or YAML Open API 3.0 Version docs and create a fienge client code spring boot.
For this lets create a simple spring boot application with just spring web and spring boot dependencies
Please follow the below step religiously
Now add following dependencies in pom.xml of this new create project simple-springboot-swagger-feign-client
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | <properties> <java.version>11</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <springfox-version>2.7.0</springfox-version> </properties> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-codegen-maven-plugin</artifactId> <version>3.0.0-rc1</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${springfox-version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${springfox-version}</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> </dependency> <dependency> <groupId>com.github.joschi.jackson</groupId> <artifactId>jackson-datatype-threetenbp</artifactId> <version>2.6.4</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-security</artifactId> <version>2.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.3.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>io.swagger.codegen.v3</groupId> <artifactId>swagger-codegen-maven-plugin</artifactId> <version>3.0.16</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>http://localhost:8080/v2/api-docs</inputSpec> <language>spring</language> <library>spring-cloud</library> <configOptions> <generateForOpenFeign>true</generateForOpenFeign> <sourceFolder>src/main/java/</sourceFolder> </configOptions> <output>${project.build.directory}/generated-sources/swagger </output> </configuration> </execution> </executions> </plugin> </plugins> <pluginManagement> <plugins> <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.--> <plugin> <groupId>org.eclipse.m2e</groupId> <artifactId>lifecycle-mapping</artifactId> <version>1.0.0</version> <configuration> <lifecycleMappingMetadata> <pluginExecutions> <pluginExecution> <pluginExecutionFilter> <groupId> io.swagger.codegen.v3 </groupId> <artifactId> swagger-codegen-maven-plugin </artifactId> <versionRange> [3.0.16,) </versionRange> <goals> <goal>generate</goal> </goals> </pluginExecutionFilter> <action> <ignore></ignore> </action> </pluginExecution> </pluginExecutions> </lifecycleMappingMetadata> </configuration> </plugin> </plugins> </pluginManagement> </build> |
Whole pom.xml for simple-springboot-swagger-feign-client
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.0-SNAPSHOT</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.siddhu</groupId> <artifactId>simple-springboot-swagger-feign-client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>simple-springboot-swagger-feign-client</name> <description>This is simple swagger spring boot example uses swagger codegen code to generate Fienge client </description> <properties> <java.version>11</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <springfox-version>2.7.0</springfox-version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-codegen-maven-plugin</artifactId> <version>3.0.0-rc1</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${springfox-version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${springfox-version}</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> </dependency> <dependency> <groupId>com.github.joschi.jackson</groupId> <artifactId>jackson-datatype-threetenbp</artifactId> <version>2.6.4</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-security</artifactId> <version>2.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.3.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>io.swagger.codegen.v3</groupId> <artifactId>swagger-codegen-maven-plugin</artifactId> <version>3.0.16</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>http://localhost:8080/v2/api-docs</inputSpec> <language>spring</language> <library>spring-cloud</library> <configOptions> <generateForOpenFeign>true</generateForOpenFeign> <sourceFolder>src/main/java/</sourceFolder> </configOptions> <output>${project.build.directory}/generated-sources/swagger </output> </configuration> </execution> </executions> </plugin> </plugins> <pluginManagement> <plugins> <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.--> <plugin> <groupId>org.eclipse.m2e</groupId> <artifactId>lifecycle-mapping</artifactId> <version>1.0.0</version> <configuration> <lifecycleMappingMetadata> <pluginExecutions> <pluginExecution> <pluginExecutionFilter> <groupId> io.swagger.codegen.v3 </groupId> <artifactId> swagger-codegen-maven-plugin </artifactId> <versionRange> [3.0.16,) </versionRange> <goals> <goal>generate</goal> </goals> </pluginExecutionFilter> <action> <ignore></ignore> </action> </pluginExecution> </pluginExecutions> </lifecycleMappingMetadata> </configuration> </plugin> </plugins> </pluginManagement> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <releases> <enabled>false</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <releases> <enabled>false</enabled> </releases> </pluginRepository> </pluginRepositories> </project> |
Again try to run mvn clean compile
On successful running of the command we will be able to see the output folder generated with Feignclient as shown belwo
Now lets take this code in our new springboot project and use it to check if the code created is working or not.
Lets create a new springboot project and call it as Swagger2SpringBootUsingFeignClient
and copy the code from simple-springboot-swagger-feign-client to Swagger2SpringBootUsingFeignClient and change the pom.xml of Swagger2SpringBootUsingFeignClient as per the pom.xml created in simple-springboot-swagger-feign-client.
Complete pom.xml of our Swagger2SpringBootUsingFeignClient looks like this.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.16.RELEASE</version> </parent> <groupId>com.siddhu</groupId> <artifactId>Swagger2SpringBootUsingFeignClient</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Swagger2SpringBootUsingFeignClient</name> <description>This is simple swagger code FeignClient spring boot project example uses Feignclient code generated by swagger codegen code</description> <properties> <java.version>1.7</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <swagger-core-version>1.5.18</swagger-core-version> </properties> <build> <sourceDirectory>src/main/java</sourceDirectory> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Greenwich.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- by siddhu start [ --> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>${swagger-core-version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.3.6.RELEASE</version> </dependency> <dependency> <groupId>com.github.joschi.jackson</groupId> <artifactId>jackson-datatype-threetenbp</artifactId> <version>2.6.4</version> </dependency> <!-- Bean Validation API support --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> <!-- by siddhu end ] --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <releases> <enabled>false</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <releases> <enabled>false</enabled> </releases> </pluginRepository> </pluginRepositories> </project> |
Also you need to make following changes
IndexControllerApiClient and BasicErrorControllerApiClient instead ${thisIsTitleForSiddhuSwaggerExample.url://localhost:8080/ use
${thisIsTitleForSiddhuSwaggerExample.url:localhost:8080/
@FeignClient(contextId=”IndexControllerApiClient”, name=”${thisIsTitleForSiddhuSwaggerExample.name:thisIsTitleForSiddhuSwaggerExample}”, url=”${thisIsTitleForSiddhuSwaggerExample.url:localhost:8080/}”, configuration = ClientConfiguration.class)
public interface IndexControllerApiClient extends IndexControllerApi {
}
Addtional as we want to use now OpenFieng instead of netflix fieng we have to make following change in the files
3- Finally we will exposed our Fieng client on 8090 and will check its documentation using swagger ui and will call the original W/S that is exposed on 8080.
First run your base project on 8080
Run the newly create project at different port
Update your springboot applicaiton entry class as given belwo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 1- Swagger2SpringBootUsingFeignClientApplication package io.swagger; import java.io.IOException; import java.util.Collections; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.ApplicationContext; import org.springframework.web.client.RestClientException; import io.swagger.controller.Swagger2SpringBootUsingFeignClientApplicationController; @SpringBootApplication @EnableFeignClients public class Swagger2SpringBootUsingFeignClientApplication { // public static void main(String[] args) { // SpringApplication.run(Swagger2SpringBootUsingFeignClientApplication.class, args); // // } public static void main(String[] args) throws RestClientException, IOException { SpringApplication app = new SpringApplication(Swagger2SpringBootUsingFeignClientApplication.class); app.setDefaultProperties(Collections.singletonMap("server.port", "8090")); ApplicationContext ctx =app.run(Swagger2SpringBootUsingFeignClientApplication.class,args); Swagger2SpringBootUsingFeignClientApplicationController objSwagger2SpringBootUsingFeignClientApplicationController = ctx.getBean(Swagger2SpringBootUsingFeignClientApplicationController.class); System.out.println("-----------------------------------------"+objSwagger2SpringBootUsingFeignClientApplicationController); objSwagger2SpringBootUsingFeignClientApplicationController.testFeignClients(); } } |
Note :-
You can download the code from
simple-springboot-swagger
https://github.com/shdhumale/simple-springboot-swagger.git
simple-springboot-swagger-feign-client
https://github.com/shdhumale/simple-springboot-swagger-feign-client.git
Swagger2SpringBootUsingFeignClient
https://github.com/shdhumale/Swagger2SpringBootUsingFeignClient.git
No comments:
Post a Comment