Sajith Vijesekara
Sajith Vijesekara

Reputation: 1372

Swagger UI CORS configuration Java CXF jersey REST API

Hi i have problem with swagger UI. I have configuration file which similar to this one.

<bean id="resourceWriter" class="com.wordnik.swagger.jaxrs.listing.ResourceListingProvider" />
<bean id="apiWriter" class="com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider" />
<bean id="swaggerResourceJSON" class="com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON" />

<jaxrs:server id="swaggerAPI" address="/swagger">
    <jaxrs:serviceBeans>
        <ref bean="swaggerResourceJSON"/>
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
        <bean class="com.ge.aviation.svc.fss.exception.WebExceptionHandler"/>
        <ref bean="resourceWriter"/>
        <ref bean="apiWriter"/>
    </jaxrs:providers>
</jaxrs:server>

<bean id="swaggerConfig" class="com.wordnik.swagger.jaxrs.config.BeanConfig">
    <property name="resourcePackage" value="package.of.my.service"/>
    <property name="version" value="1.0.0"/>
    <property name="basePath" value="http://localhost:8090/"/>
    <property name="title" value="Sample Service"/>
    <property name="description" value="Service for storing, searching, and retrieving files."/>
    <property name="contact" value="[email protected]"/>
    <property name="scan" value="true"/>
</bean>

Then My server running perfectly and there is end point for swagger UI. http://localhost:8095/api/api-docs/ Then i copy this URL in browser it will show the Json file.But I have copied swagger UI dist file in my tomcat(not same server above mention) then add the above URL then IT says Can't read from server. It may not have the appropriate access-control-origin settings.I found the cause of the error is https://github.com/swagger-api/swagger-ui/issues/146 and https://github.com/swagger-api/swagger-ui#cors-support But I want to know how to cors set for ApiListingResourceJSON class which have api-docs end point.

Upvotes: 0

Views: 2087

Answers (2)

Sajith Vijesekara
Sajith Vijesekara

Reputation: 1372

I have fixed the problem using this way. Ron's answer also correct but i didn't use any web.xml configuration.This is the Answer .org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter added to server as provide and @CrossOriginResourceSharing(allowAllOrigins = true, allowCredentials = true) annotation added to REST API controller.

Upvotes: 2

Ron
Ron

Reputation: 14830

All the samples in the swagger-core project contain a sample filer and configuration how to enable CORS support.

Basically, you'd create the following filter:

public class ApiOriginFilter implements javax.servlet.Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    HttpServletResponse res = (HttpServletResponse) response;
    res.addHeader("Access-Control-Allow-Origin", "*");
    res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
    res.addHeader("Access-Control-Allow-Headers", "Content-Type, api_key, Authorization");
    chain.doFilter(request, response);
  }

  @Override
  public void destroy() {
  }

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }
}

And add it to your web.xml:

  <filter>
    <filter-name>ApiOriginFilter</filter-name>
    <filter-class>com.wordnik.swagger.sample.util.ApiOriginFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>ApiOriginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Of course if you don't use web.xml there alternative ways to hook it up, but that depends on your use case.

By adding all that, CORS would be enabled throughout your application.

Upvotes: 3

Related Questions