Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用映射到根上下文的RESTAPI来提供来自CXF/JAX-RS的静态内容?_Java_Rest_Jax Rs_Cxf_Web.xml - Fatal编程技术网

Java 如何使用映射到根上下文的RESTAPI来提供来自CXF/JAX-RS的静态内容?

Java 如何使用映射到根上下文的RESTAPI来提供来自CXF/JAX-RS的静态内容?,java,rest,jax-rs,cxf,web.xml,Java,Rest,Jax Rs,Cxf,Web.xml,我有一个使用CXF实现JAX-RS的RESTAPI,其中rest端点直接位于根上下文上 例如,如果我的根上下文是localhost:8080/myservice 我的端点是: 本地主机:8080/myservice/resource1 本地主机:8080/myservice/resource2 但我想像这样提供静态内容: localhost:8080/myservice/docs/swagger.json 在我的web.xml中,我想做如下操作: <servlet-mapping>

我有一个使用CXF实现JAX-RS的RESTAPI,其中rest端点直接位于根上下文上

例如,如果我的根上下文是localhost:8080/myservice

我的端点是:
本地主机:8080/myservice/resource1
本地主机:8080/myservice/resource2

但我想像这样提供静态内容:
localhost:8080/myservice/docs/swagger.json

在我的web.xml中,我想做如下操作:

<servlet-mapping>
  <servlet-name>CXFServlet</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/docs/*</url-pattern>
</servlet-mapping>

CXF服务器
/*
违约
/文件/*
但这不起作用,CXFServlet接收所有请求,我无法找到一种方法来配置CXF/JAX-RS,以便在不包括新库和创建字节流等情况下为我的静态内容提供服务。我不想这样做。我只想映射到默认的servlet

CXF文档不容易理解,我尝试执行以下操作失败:

<servlet>
  <servlet-name>CXFServlet</servlet-name>
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  <init-param>
    <param-name>static-resources-list</param-name>
    <param-value>
      /docs/(\S)+\.html
      /docs/(\S)+\.json
    </param-value>
  </init-param>
</servlet>

CXF服务器
org.apache.cxf.transport.servlet.CXFServlet
静态资源列表
/docs/(\S)+\.html
/docs/(\S)+\.json

有什么想法吗?

多亏了

下面是我的web.xml中的servlet配置,用于使用映射到根目录的CXFServlet服务静态资源

<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <init-param>
        <param-name>redirects-list</param-name>
        <param-value>
          /docs/(\S)+\.html
          /docs/(\S)+\.json
    </param-value>
    </init-param>
    <init-param>
        <param-name>redirect-attributes</param-name>
        <param-value>
          javax.servlet.include.request_uri
    </param-value>
    </init-param>
    <init-param>
        <param-name>redirect-servlet-name</param-name>
        <param-value>default</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

CXF服务器
org.apache.cxf.transport.servlet.CXFServlet
重定向列表
/docs/(\S)+\.html
/docs/(\S)+\.json
重定向属性
javax.servlet.include.request_uri
重定向servlet名称
违约
1.
CXF服务器
/*

希望这对其他人有所帮助。

您可以通过将静态内容添加到CXF Jetty资源处理程序来提供静态内容:

<bean id="jettyHTTPServerEngine" class="org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine">
    <property name="threadingParameters" ref="threadingParameters" />
    <property name="port" value="8080" />
      <property name="handlers">
          <list>
              <ref bean="contextHandler" />
          </list>
      </property>
  </bean>

    <bean name="contextHandler" class="org.eclipse.jetty.server.handler.ContextHandler">
        <property name="contextPath" value="/content"/>
        <property name="handler" ref="resourceHandler"/>
    </bean>    

    <bean id="resourceHandler" class="org.eclipse.jetty.server.handler.ResourceHandler">
        <property name="resourceBase" value="#{classpathResourceResolver.path}"/>
        <property name="directoriesListed" value="true"/>
    </bean>

<bean id="classpathResourceResolver" class="com.myapp.ClasspathResourceResolver">
    <property name="resourceLocation" value="myresources/files"/>
  </bean>

CXFServlet能够直接为静态内容提供服务;将“static resources list”init param与类路径中以空格分隔的静态资源列表一起使用:

        <init-param>
            <param-name>static-resources-list</param-name>
            <param-value>/static/(\w)+.css</param-value>
        </init-param>

静态资源列表
/静态/(\w)+.css
还可以通过“静态缓存控制”设置HTTP响应缓存控制头:

        <init-param>
            <param-name>static-cache-control</param-name>
            <param-value>public, max-age=31536000</param-value>
        </init-param>

静态缓存控制
公共,最大年龄=31536000

“重定向请求和服务静态内容”一节中添加了我的2美分,因为我受到了这个问题和答案的启发

我想在JAVA中配置它,同时发现我必须使用不同的正则表达式

我将把代码放在这里,但首先要解释:

我的应用程序使用spring boot+cxf。CXF被映射到root“/”并且CXF无法为静态资源提供服务器,因此我添加了重定向servlet name param,该参数表示“嘿,CXF,如果请求以.css结尾,则将请求分派给dispatcherServlet”

为什么是调度器servlet?它是SpringBoot的默认servlet,例如,它能够为特定文件夹中的静态内容提供服务器

@Bean
public ServletRegistrationBean<CXFServlet> servletRegistrationBean() {
    ServletRegistrationBean<CXFServlet> x = new ServletRegistrationBean<>(new CXFServlet(), "/*");

    Map<String, String> params = new HashMap<>();
    params.put("redirects-list", ".*\\.css$"); // space separated list if multiple values are required
    params.put("redirect-servlet-name", "dispatcherServlet");
    x.setInitParameters(params);
    return x;
}
@Bean
公共ServletRegistrationBean ServletRegistrationBean(){
ServletRegistrationBean x=新的ServletRegistrationBean(新的CXFServlet(),“/*”);
Map params=新的HashMap();
params.put(“重定向列表”,“*\\.css$”;//如果需要多个值,则以空格分隔列表
put(“重定向servlet名称”、“dispatcherServlet”);
x、 setInitParameters(params);
返回x;
}

根上下文是在web容器级别配置的,必须是host:port/myservice,因为有许多其他服务部署到同一主机:port。
@Bean
public ServletRegistrationBean<CXFServlet> servletRegistrationBean() {
    ServletRegistrationBean<CXFServlet> x = new ServletRegistrationBean<>(new CXFServlet(), "/*");

    Map<String, String> params = new HashMap<>();
    params.put("redirects-list", ".*\\.css$"); // space separated list if multiple values are required
    params.put("redirect-servlet-name", "dispatcherServlet");
    x.setInitParameters(params);
    return x;
}