具有所需构造函数参数的Restlet服务器资源

时间:2013-02-25 18:20:05

标签: java inversion-of-control restlet

在restlet中出现此错误:

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

我确切知道为什么。这是因为我的构造函数看起来像这样:

public UnsubscribeForwardUIResource(MySQLConnectionPool connectionPool) {

Andlet会像这样访问资源:

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

问题是我实际上需要那个ctor参数。我怎样才能访问它? (注意我没有使用任何IOC框架,只有很多ctor参数,但这实际上是一个IOC模式)。

2 个答案:

答案 0 :(得分:11)

您可以使用上下文将上下文属性传递给资源实例。

来自ServerResource API doc

  

使用默认构造函数进行实例化后,将调用最终的Resource.init(Context,Request,Response)方法,设置上下文,请求和响应。您可以通过覆盖Resource.doInit()方法来拦截它。

所以,在附件时间:

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

在UnsubscribeForwardUIResource类中,您必须将初始化代码从构造函数移动到de doInit方法:

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
}

答案 1 :(得分:1)

如果您不使用IoC,则应手动执行,例如:您可以附加Restlet实例而不是类。您可以使用Context来检索属性。

但也许它有更多的意义来利用IoC容器,这将简化它并减少样板代码,例如:这是为春天:http://pastebin.com/MnhWRKd0