其实你可以。经过几个小时的调试,我想出了这个:
1)在你的案例中声明多个不安的服务(在我的情况下是两个)web.xml
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/openrest</param-value>
</init-param>
<init-param>
<param-name>resteasy.resources</param-name>
<param-value>com.mycompany.rest.PublicService</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>private-resteasy-servlet</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/protectedrest</param-value>
</init-param>
<init-param>
<param-name>resteasy.resources</param-name>
<param-value>com.mycompany.rest.PrivateService</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>private-resteasy-servlet</servlet-name>
<url-pattern>/protectedrest/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/openrest/*</url-pattern>
</servlet-mapping>
请注意,我们初始化个人和每个 servlet 的事实。请不要忘记不要包含任何botstrap类作为过滤器或servlet!并禁用自动扫描。resteasy.servlet.mapping.prefix
resteasy.resources
2) 创建一个过滤器,从 RESTeasy 保存在上下文中的全局信息中清理应用程序:
public class ResteasyCleanupFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
request.getServletContext().setAttribute(ResteasyProviderFactory.class.getName(), null);
request.getServletContext().setAttribute(Dispatcher.class.getName(), null);
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
注册它以请求您的服务(在这里我将其用于所有简单化请求):
<filter>
<filter-name>CleanupFilter</filter-name>
<filter-class>com.mycompany.ResteasyCleanupFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CleanupFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
就是这样!现在你有两个不同的REST服务,它们位于不同的前缀下:这意味着为所有公共请求提供服务,并处理应用程序中的所有私有内容。/openrest
/protectedrest
那么为什么它有效(或者为什么它不起作用)?
当您第一次调用实例时,它会尝试初始化自身,并且当完成时,会将状态保存在全局中,如下所示:openrest
servletContext
servletContext.setAttribute(ResteasyProviderFactory.class.getName(), deployment.getProviderFactory());
servletContext.setAttribute(Dispatcher.class.getName(), deployment.getDispatcher());
如果你让它成为你的调用你的第二个将获得相同的配置!这就是为什么您需要在某个地方清理此信息的原因。这就是为什么我们使用我们的'清空上下文',这样全新的 rest servlet 就可以用我们声明的所有 init 参数初始化自身。/protectedrest
CleanupFilter
这是一个黑客,但它可以解决问题。
此解决方案已针对 RESTEasy 2.3.6 进行了测试
编辑
也适用于3.0.9.final!