10

在 restlet 中出现此错误:

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

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

ServerResource API 文档

使用默认构造函数实例化后,调用最终的 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
}
于 2013-03-05T08:50:07.467 回答
1

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

但也许使用 IoC 容器更有意义,这将简化它并减少样板代码,例如这是针对 Spring: http: //pastebin.com/MnhWRKd0

于 2013-02-28T12:07:41.527 回答