10

レストレットでこのエラーが発生する:

ForwardUIApplication ; Exception while instantiating the target server resource.
java.lang.InstantiationException: me.unroll.forwardui.server.ForwardUIServer$UnsubscribeForwardUIResource

そして、私はその理由を正確に知っています。これは、私のコンストラクターが次のようになっているためです。

public UnsubscribeForwardUIResource(MySQLConnectionPool connectionPool) {

そして、Restletは次のようにリソースにアクセスします。

router.attach(Config.unsubscribeUriPattern(), UnsubscribeForwardUIResource.class);

問題は、実際にそのctor引数が必要なことです。どうすればアクセス可能にできますか?(私はIOCフレームワークを使用しておらず、ctor引数がたくさんあることに注意してください。ただし、これは実際にはIOCパターンです)。

4

2 に答える 2

11

You can use the context to pass context atributes to your resource instance.

From the ServerResource API doc:

After instantiation using the default constructor, the final Resource.init(Context, Request, Response) method is invoked, setting the context, request and response. You can intercept this by overriding the Resource.doInit() method.

So, at attachment time:

router.getContext().getAttributes().put(CONNECTION_POOL_KEY, connectionPool);
router.attach(Config.unsubscribeUriPattern(), UnsubscribeForwardUIResource.class);

At your UnsubscribeForwardUIResource class you'll have to move the initialization code from the constructor to de doInit method:

public UnsubscribeForwardUIResource() {
    //default constructor can be empty
}

protected void doInit() throws ResourceException {

     MySQLConnectionPool connectionPool = (MySQLConnectionPool) getContext().getAttributes().get(CONNECTION_POOL_KEY);

    // initialization code goes here
}
于 2013-03-05T08:50:07.467 に答える
1

IoC を使用していない場合は、手動で行う必要があります。たとえば、クラスの代わりに Restlet インスタンスをアタッチできます。Contextを使用して属性を取得できます。

しかし、単純化して定型コードを削減する IoC コンテナーを利用するほうが理にかなっているかもしれません。たとえば、これは Spring 用です: http://pastebin.com/MnhWRKd0

于 2013-02-28T12:07:41.527 に答える