In this post we are going to add some of the CXF features to our existing app that we developed in previous post. These features are :
- ID Logging
- Jackson Provider for POJO to JSON conversion
- Swagger 2 documentation
Step 1: Configuration class
Create a RestServer class in config package as shown below
package org.blog.config; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import org.apache.cxf.feature.LoggingFeature; import org.apache.cxf.jaxrs.swagger.Swagger2Feature; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Created by Anand_Rajneesh on 3/23/2017. */ @Configuration public class RestServer { @Bean public JacksonJsonProvider jsonProvider(){ return new JacksonJsonProvider(); } @Bean public LoggingFeature loggingFeature(){ return new LoggingFeature(); } @Bean public Swagger2Feature swagger(){ Swagger2Feature swagger = new Swagger2Feature(); swagger.setBasePath("/services"); swagger.setContact(""); swagger.setLicense(""); swagger.setTitle("Demo Spring Boot CXF Application"); swagger.setDescription(""); return swagger; } }
We have 3 @Bean methods, which are returning instances of each feature.
Step 2: POM dependencies
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.8.5</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-service-description-swagger</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>swagger-ui</artifactId> <version>${swaggerui.version}</version> </dependency>
Step 3: Adding Swagger annotations
Add swagger annotations to Ping service that was created in previous past like below.
package org.blog.rest; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import org.springframework.stereotype.Service; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * Created by Anand_Rajneesh on 3/24/2017. */ @Path("/ping") @Service @Api(value = "ping") @Produces(MediaType.TEXT_PLAIN) public class Ping { @GET @ApiOperation(value="Health Check") @ApiResponse(code=200, message ="") public Response health(){ return Response.ok().build(); } }
Now go ahead and deploy the server, and go at http://localhost:8080/services/services. You would get a link to swagger ui there.
POM dependencies -> Mandatory
ReplyDeleteThe overall approach is a good example of how backend services can be prepared for development and consumption by other applications. Combining REST endpoints with JSON conversion, logging, and automatically generated API documentation also provides useful context for a broader Web Development Course, where API design and integration are important parts of modern web applications.
ReplyDeleteThe dependency setup and Swagger annotations on the Ping service also demonstrate that exposing a REST endpoint involves more than writing the service method itself. JSON serialization, request/response logging, API descriptions, and documentation all contribute to a usable web service, making the example relevant to a Spring Boot Angular Full Stack Course, particularly from the Spring Boot backend perspective.
ReplyDeleteThe article is also particularly relevant to a Spring Boot ReactJS Full Stack Course, since the Spring Boot side can expose REST APIs through CXF while a React frontend can consume those APIs. Although React is not discussed directly in the article, the REST API layer described here is an important part of such a full-stack architecture.
ReplyDelete