3

我有一个与 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;
    }
}
4

2 回答 2

2

不知何故,GWT 的风格还是不太了解依赖注入的需求。这 - 在某种程度上 - 在客户端是可以原谅的,但在服务器端却不是这样(老实说,我真的希望 GWT 和 Guice 团队能够联手改善这种情况。)

现在,幸运的是,Guice 提供了一种“遗留”机制来注入静态字段,请参阅http://code.google.com/docreader/#p=google-guice&s=google-guice&t=Injections中的“静态注入” )。因此,您可以将 EntityManager/EntityManagerFactory(或您用来执行持久性的任何内容)注入静态字段。

您不必直接这样做,但您可以使用 Provider。然后选择正确的范围(例如@RequestScoped)以使提供者为您提供正确的实例。

注意:我还没有尝试过(尽管我打算这样做),因为我还没有在实际项目中使用 RequestFactory。我希望遗留机制在这种情况下有效,但你可能会遇到一些障碍(?)

于 2011-02-10T21:36:49.850 回答
2

如果您使用Locator来控制 RequestFactory 服务器代码如何通过Locator.find()为您的域对象适当地实现来获取 POJO 的实例,那么 pojo 不必是默认可实例化的。定位器还允许您使用不符合getId() / getVersion()协议的域对象。

@ProxyFor(value = Person.class, locator = PersonLocator.class)
interface PersonProxy extends EntityProxy { .... }

如果您需要更改大多数域 pojo 的行为,您可以注入一个重载createDomainObject()loadDomainObject().

于 2011-02-10T23:00:31.560 回答