我有一个与GWT的RequestFactory和相关代理一起使用的POJO。 POJO有静态方法(list()
)和实例方法(persist()
),它们需要访问我的数据库。我的数据库连接池设置为通过Guice注入单例。我不确定的是我究竟能如何进行注射,以便这两种方法都可以访问它?
此外,POJO的实例是使用空构造函数创建的,因此无法使用构造函数注入。
以下是一个示例POJO供参考:
public class Person {
private Integer id;
private String name;
public Integer getId() { return this.id; }
public void setId(Integer id) { this.id = id; }
public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
public void persist() {
//TODO: save state to DB
}
public static List<Person> list() {
//TODO: get all people from DB
return null;
}
}
答案 0 :(得分:2)
不知何故,GWT的风格仍然不太了解依赖注入的需求。这在某种程度上是客户端可以原谅的,但在服务器端却没有那么多(说实话,我真的希望,GWT和Guice团队将联合起来改善这种情况。)
现在,幸运的是,Guice为注入静态字段提供了“遗留”机制,请参阅http://code.google.com/docreader/#p=google-guice&s=google-guice&t=Injections中的“静态注入”。因此,您可以将EntityManager / EntityManagerFactory(或您用于执行持久性的任何内容)注入静态字段。
您不必直接执行此操作,但可以使用提供程序。然后选择正确的范围(例如@RequestScoped)以使提供者为您提供正确的实例。
注意:我还没有尝试过(虽然我打算这样做),因为我还没有在一个真实的项目中使用RequestFactory。我希望遗留机制适用于这种情况,但你可能遇到一些障碍(?)
答案 1 :(得分:2)
如果您使用Locator来控制RequestFactory服务器代码如何通过实现适用于您的域对象的Locator.find()
来获取POJO的实例,则pojo不必是默认可实例化的。定位器还允许您使用不符合getId() / getVersion()
协议的域对象。
@ProxyFor(value = Person.class, locator = PersonLocator.class)
interface PersonProxy extends EntityProxy { .... }
如果您需要更改大多数域名pojos的行为,您可以注入createDomainObject()
重载loadDomainObject()
和{{1}}。