Reputation: 1372
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
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
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