我必须制作一个非常小的REST应用程序,即使我已经习惯了Spring,Jersey似乎比Spring更轻(也许我错了?)。
我在Tomcat 8.0.39上使用Jersey 2.25。
我有一个当前访问文本文件的DAO类(将升级到jdbc连接)。那些读/写操作必须同步,因此我希望我的DAO实例是单例。
@Singleton
public class ModelDao extends IModelDao
public ModelDao() {
System.out.println("init ModelDao");
}
@Override
public MyModel read(int id){...}
}
这个单身人士注入了一项服务:
@Path("/Model/")
public class ModelService {
@Inject
private IModelDao modelDao;
@Path("{id}")
@GET
@Produces("application/json")
public MyModel getModel(@PathParam("id") Integer id) {
return modelDao.read(id);
}
}
通过活页夹
public class DaoBinder extends AbstractBinder {
@Override
protected void configure() {
bind(ModelDao.class).to(IModelDao.class);
}
}
在ResourceConfig
中,我注册了活页夹和我的包。
当我使用我的服务时,我得到了正确的数据,但每个请求都会调用ModelDao
构造函数。因此读/写操作不同步。
我理解一个带注释的类@Singleton
应该只在我的应用中实例化一次。
我弄错了吗?
答案 0 :(得分:2)
通过AbstractBinder
将服务绑定到Jersey,不支持@Singleton
注释。您需要使用bind().to().in(Scope)
语法,其中Scope
将是例如Singleton.class
。 RequestScoped.class
,PerLookup
。默认范围是bind(Class).to(Class)
,这会导致您当前遇到的行为。
而不是bind(Instance).to(Class)
,您可以使用class Some {
var p :OtherClass?
func someMethod() {
p = p ?? OtherClass()
...
}
}
,这会自动使其成为单身,而无需指定范围。
答案 1 :(得分:-1)
将类设置为Singleton后,是否在应用程序中注册了它?
这样的事情:
public class App extends ResourceConfig {
public App () {
register(ModelDao.class);
}
}