2015-04-23 2 views
0

Привет, у меня проблема с пользовательским интерфейсом swagger. У меня есть файл конфигурации, похожий на этот.Конфигурация Swagger UI CORS Java API 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> 

Тогда мой сервер работает отлично и есть конечная точка для пользовательского интерфейса swagger. http://localhost:8095/api/api-docs/ Затем я копирую этот URL-адрес в браузере, он покажет Json-файл. Но я скопировал файл UI-файла swagger в моем tomcat (не тот же сервер, который упоминается выше), затем добавьте вышеприведенный 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/146 и https://github.com/swagger-api/swagger-ui#cors-support Но я хочу знать, как установить корс для класса ApiListingResourceJSON, которые имеют конечную точку api-docs.

ответ

1

Я исправил проблему, используя этот способ. Ответ Рона также правильный, но я не использовал конфигурацию web.xml. Это ответ. org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter добавлено в сервер как предоставление и @CrossOriginResourceSharing(allowAllOrigins = true, allowCredentials = true) аннотация добавлена ​​в REST API-контроллер.

+0

Итак, вы больше не используете io.swagger.jaxrs.listing.ApiListingResource и внедрили свой ресурс вместо этого? –

2

Все образцы в проекте с чартер-сердечником содержат образец фильтра и конфигурацию, как включить поддержку 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

Спасибо Рон за ваш комментарий. Я выяснил, в чем проблема. я не использовал какой-либо веб-файл xml. Так что я добавляю CrossOriginResourceSharingFilter в качестве поставщика и добавляю аннотацию @CrossOriginResourceSharing (allowAllOrigins = true, allowCredentials = true) к REST api, и это устранит проблему. Спасибо за вашу помощь. – Sajithv