Java 如何使用映射到根上下文的RESTAPI来提供来自CXF/JAX-RS的静态内容?
我有一个使用CXF实现JAX-RS的RESTAPI,其中rest端点直接位于根上下文上 例如,如果我的根上下文是localhost:8080/myservice 我的端点是: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>
本地主机: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;
}