在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模式)。
答案 0 :(得分:11)
您可以使用上下文将上下文属性传递给资源实例。
使用默认构造函数进行实例化后,将调用最终的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