Search code examples
javaxmlmavencxfswagger

Swagger2feature CXF xml configuration


I am trying to configure CXF nonSpring with Swagger to see the json documentation generated, but I can not see where the url that was generated from Swagger is. Here is my code:

pom.xml

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-service-description-swagger</artifactId>
            <version>3.1.11</version>
        </dependency>

web.xml

<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <display-name>CXFServlet</display-name>
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value> com.bank.AdminApplication </param-value>
    </init-param>
    <init-param>
        <param-name>jaxrs.application.address.ignore</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>jaxrs.features</param-name>
        <param-value>
                    org.apache.cxf.jaxrs.swagger.Swagger2Feature
                    (basePath=/swagger/api​docs)
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

main interface with definitions and annotations:

@Path("/")
@Api(value="/swagger/apidocs")
public interface ApiClient {

    @GET
    @Path("endpoint/consult")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Consult test Endpoint", response = Response.class)
    public Response consultEndpoint() throws ServiceException;

}

I go to: http://localhost:8080/webapp/swagger/apidocs but nothing appears

Any recommendation?


Solution

  • Well, finally I found how to integrate CXF non spring with swagger; here is the code:

    pom.xml

    <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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>coop.bancocredicoop.test</groupId>
    <artifactId>test-api-cxfnonspring-swagger</artifactId>
    <version>1.0.0</version>
    <name>test-api-cxfnonspring-swagger</name>
    <description>Servicios test api rest</description>
    <packaging>war</packaging>
    <dependencies>
       <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>swagger-ui</artifactId>
            <version>3.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-service-description-swagger</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.9.3</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
            </plugin>
            <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.6.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
        </plugins>
    </build>
    

    web.xml

    <?xml version="1.0"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><servlet>
      <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.AdminApplication</param-value>
        </init-param>
        <init-param>
            <param-name>jaxrs.address</param-name>
            <param-value>/</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping></web-app>
    

    AdminAplication.java

    import java.util.HashSet;
    import java.util.Set;
    import javax.ws.rs.core.Application;
    import org.apache.cxf.jaxrs.swagger.Swagger2Feature;
    import com.fasterxml.jackson.databind.AnnotationIntrospector;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
    import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
    public class AdminApplication extends Application {
    HashSet<Object> singletons = new HashSet<Object>();
    public AdminApplication() {
        singletons.add(new PersonService());
    }
    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>();
        return set;
    }
    @Override
    public Set<Object> getSingletons() {
        ObjectMapper mapper = new ObjectMapper();
        AnnotationIntrospector primary = new JacksonAnnotationIntrospector();
        AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
        mapper.setAnnotationIntrospectors(primary, secondary);
        JacksonJsonProvider jaxbProvider = new JacksonJsonProvider();
        jaxbProvider.setMapper(mapper);
        singletons.add(jaxbProvider);
        Swagger2Feature feature = new Swagger2Feature();
        feature.setContact("Pablo Garcia");
        feature.setDescription("api Description");
        feature.setPrettyPrint(true);
        feature.setTitle("api title");
        singletons.add(feature);
        return singletons;
      }
    }
    

    PersonService.java

    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    
    @Path("/people")
    @Produces(MediaType.APPLICATION_JSON)
    @Api(value = "/people")
    public class PersonService {
    
      @GET
      @Produces(MediaType.APPLICATION_JSON)
      @Path("/person/{id}/")
      @ApiOperation(
          value = "api value",
          notes = "api notes "
      )
      public Response getPerson(@PathParam("id") String personId) throws Exception {
          PersonResponse p = new PersonResponse();
          return Response.ok(p).build();
      }
    }
    

    And finally, a simple POJO PersonResponse:

    public class PersonResponse {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }