2015-04-23 87 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