です。私たちは、個人resteasy.servlet.mapping.prefix
とresteasy.resources
を初期化していることに注意してください私の場合は自分のweb.xml
(2)
<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>
で複数のRESTEasyのサーブレットを宣言します)
1:デバッグの数時間後、私はこの思い付きました私たちのサーブレットごとに。 を忘れないでください。には、フィルタまたはサーブレットとしてのボットストラップクラスが含まれています。オートスキャンも無効にします。 )
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
}
}
は、ここで私はsimplisityに対するすべての要求のためにそれを使用し(あなたのサービスへの要求のためにそれを登録します。
2)それはコンテキストに保存していることのRESTEasyのグローバルな情報からアプリケーションをクリーンアップフィルタを作成します。 :!/openrest
Aですべてのプライベートなものについて世話をするすべての公開要求と/protectedrest
にサービスを提供するためのもの:
これだけ
<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サービスを持っていますpp。
なぜそれが機能するのですか(またはそれが別の方法で動作しないのはなぜですか)?
あなたはそれが自分自身をinitalizeしようと行われたときに、このようにグローバルservletContext
に状態を保存し、初めてopenrest
インスタンスを呼び出します。
servletContext.setAttribute(ResteasyProviderFactory.class.getName(), deployment.getProviderFactory());
servletContext.setAttribute(Dispatcher.class.getName(), deployment.getDispatcher());
そして、あなたはそれがあなたの第二の通話もできるようになる場合/protectedrest
は同じ設定になります!だからこそ、この情報をきれいにする必要があるのです。そのため、コンテキストを空にしたCleanupFilter
を使用して、新しいrestサーブレットが、宣言したすべてのinitパラメータで初期化できるようにしました。
これはハックですが、それはトリックです。
このソリューションはRESTEasyの2.3.6
について試験したとしても3.0.9.finalで
作品を編集しました!
なぜパス注釈を変更できないのですか?あなたはコードにアクセスできない?限り、私は彼らがインターフェイスであることがわかります、あなたは実装にアクセスできますか? –