3

GAE-ShiroとResteasyを一緒に作ろうとしています。ということで、早速移植してみました。しかし、私はこのエラーが発生しています:

[ERROR] java.lang.RuntimeException: java.lang.InstantiationException: com.cilogi.shiro.guice.ServeModule
[ERROR]     at org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener.getModules(GuiceResteasyBootstrapServletContextListener.java:83)
[ERROR]     at org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener.contextInitialized(GuiceResteasyBootstrapServletContextListener.java:27)
[ERROR]     at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
[ERROR]     at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
[ERROR]     at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
[ERROR]     at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
[ERROR]     at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
[ERROR]     at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
[ERROR]     at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
[ERROR]     at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
[ERROR]     at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
[ERROR]     at org.mortbay.jetty.Server.doStart(Server.java:224)
[ERROR]     at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
[ERROR]     at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:228)
[ERROR]     at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:255)
[ERROR]     at com.google.appengine.tools.development.AbstractServer.startup(AbstractServer.java:79)
[ERROR]     at com.google.appengine.tools.development.DevAppServerImpl$Servers.startup(DevAppServerImpl.java:451)
[ERROR]     at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:198)
[ERROR]     at com.google.appengine.tools.development.gwt.AppEngineLauncher.start(AppEngineLauncher.java:97)
[ERROR]     at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509)
[ERROR]     at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068)
[ERROR]     at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
[ERROR]     at com.google.gwt.dev.DevMode.main(DevMode.java:311)
[ERROR] Caused by: java.lang.InstantiationException: com.cilogi.shiro.guice.ServeModule
[ERROR]     at java.lang.Class.newInstance0(Class.java:359)
[ERROR]     at java.lang.Class.newInstance(Class.java:327)
[ERROR]     at org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener.getModules(GuiceResteasyBootstrapServletContextListener.java:70)
[ERROR]     ... 22 more

これが私の現在のweb.xml構成です

    <context-param>
        <param-name>resteasy.guice.modules</param-name>
<!--         <param-value>org.jboss.errai.ui.demo.server.MyServletModule</param-value> -->
        <param-value>com.cilogi.shiro.guice.ServeModule</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener
        </listener-class>
    </listener>

    <context-param>  
        <param-name>resteasy.servlet.mapping.prefix</param-name>  
        <param-value>/</param-value>  
    </context-param>

    <servlet>
        <servlet-name>Resteasy</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
    </servlet>

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

    <context-param>
       <param-name>user-base-url</param-name>
       <param-value>/user/admin</param-value>
    </context-param>

    <context-param>
        <param-name>static-base-url</param-name>
        <param-value></param-value>
    </context-param>


    <listener>
        <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>com.cilogi.shiro.guice.ServeContextListener</listener-class>
    </listener>


    <mime-mapping>
        <extension>manifest</extension>
        <mime-type>text/cache-manifest</mime-type>
    </mime-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list> 
4

1 に答える 1

4

この質問はほぼ1年前のものであることに気付きましたが、最近Shiro(注:GAE-Shiroではない)とRESTEasyで同様の問題に直面し、これを経験した他の人に役立つように、ここで使用したソリューションを投稿すると考えました特定の問題。

問題は、RESTEasyGuiceResteasyBootstrapServletContextListenerがパラメーターを渡す必要があるモジュールを作成しようとしていることです (私の場合、パラメーターがShiroWebModule必要でしたServletContext...あなたの場合、com.cilogi.shiro.guice.ServeModule文字列を渡す必要があるようです)。ただし、RESTEasy がモジュールを作成しようとすると、引数なしのコンストラクターを呼び出して作成しますが、コンストラクターがないために失敗します。

私が使用することにした解決策は、メソッドを拡張GuiceResteasyBootstrapServletContextListenerおよびオーバーライドして、引数getModules(ServletContext ctx)を取るコンストラクターがServletContext存在する場合はそれを使用し、そうでない場合はデフォルトの引数なしのコンストラクターを使用することでした。

たとえば、次のようになります。

public class MyBootstrapServletContextListener extends GuiceResteasyBootstrapServletContextListener {

    @オーバーライド
    保護されたリスト getModules(最終的な ServletContext コンテキスト) {
        最終的なリストの結果 = 新しい ArrayList();
        final String modulesString = context.getInitParameter("resteasy.guice.modules");

        if (modulesString != null) {
            final String[] moduleStrings = modulesString.trim().split(",");

            for (final String moduleString : moduleStrings) {
                試す {
                    log.info("見つかったモジュール: {}", moduleString);
                    final Class cls = Thread.currentThread().getContextClassLoader().loadClass(moduleString.trim());
                    最終モジュール module = createModule(cls, context);
                    結果.追加(モジュール);
                } キャッチ (ClassNotFoundException e) {
                    新しい RuntimeException(e) をスローします。
                } キャッチ (IllegalAccessException e) {
                    新しい RuntimeException(e) をスローします。
                } キャッチ (InstantiationException e) {
                    新しい RuntimeException(e) をスローします。
                } キャッチ (IllegalArgumentException e) {
                    新しい RuntimeException(e) をスローします。
                } キャッチ (InvocationTargetException e) {
                    新しい RuntimeException(e) をスローします。
                }
            }
        }

        結果を返します。
    }

    private Module createModule(Class cls, ServletContext context) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        コンストラクター コンストラクター = null;

        試す {
            コンストラクター = cls.getConstructor(ServletContext.class);
        } キャッチ (NoSuchMethodException e) {
            log.info("クラス {} には、ServletContext パラメーターのみを受け取るコンストラクターがありません。デフォルトでは、引数なしのコンストラクターになります。", cls);
        }

        戻りコンストラクタ == null ? (モジュール) cls.newInstance() : (モジュール) constructor.newInstance(context);
    }

}

これが整ったら、RESTEasy の の代わりにweb.xml使用するように変更し、RESTEasy には問題がなくなりました。RESTEasy が必要な文字列を に渡せるようにするために、同様のことができるはずです。MyBootstrapServletContextListenerGuiceResteasyBootstrapServletContextListenercom.cilogi.shiro.guice.ServeModule

繰り返しになりますが、おそらく解決策はもう必要ないでしょうが、Shiro で同様の問題を調査しているときにこの質問に出くわしました。Web アプリで RESTEasy と Shiro を組み合わせようとしている他の人を助けたいと思っています。

于 2014-02-17T01:16:01.257 に答える