2015-04-23 52 views
0

嗨,我用swagger UI有问题。我有这个类似的配置文件。Swagger UI CORS配置Java CXF球衣REST API

<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> 

然后我的服务器运行完美,并且有一个放屁UI的终点。 http://localhost:8095/api/api-docs/然后我复制这个网址在浏览器中它会显示Json文件。但我已经复制了我的tomcat中的swagger UI dist文件(上面提到的不是同一个服务器)然后添加上面的URL然后IT说Can't read from server. It may not have the appropriate access-control-origin settings。我发现错误是https://github.com/swagger-api/swagger-ui/issues/146https://github.com/swagger-api/swagger-ui#cors-support但我想知道如何cors设置ApiListingResourceJSON类,它有API文档的终点。

回答

1

我已经用这种方法解决了这个问题。罗恩的答案也正确,但我没有使用任何web.xml配置。这是答案。 org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter添加到服务器作为提供和@CrossOriginResourceSharing(allowAllOrigins = true, allowCredentials = true)注释添加到REST API控制器。

+0

因此,您不再使用io.swagger.jaxrs.listing.ApiListingResource并实施您的资源吗? –

2

swagger-core项目中的所有示例都包含示例文件管理器和配置如何启用CORS支持。

基本上,你会创建以下过滤器:

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 { 
    } 
} 

并把它添加到你的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> 

当然,如果你不使用web.xml中有替代挂钩它的方式,但这取决于你的用例。

通过添加所有这些,CORS将在整个应用程序中启用。

+0

感谢罗恩的评论。我想出了什么问题。我没有使用任何Web xml文件。因此,我添加了CrossOriginResourceSharingFilter作为提供程序,并将@CrossOriginResourceSharing(allowAllOrigins = true,allowCredentials = true)注释添加到REST API,并且它将修复问题。无论如何,感谢您的帮助。 – Sajithv