GWT RequerstFactory - 从实体到服务定位器提取代码

时间:2014-05-15 14:01:10

标签: java gwt requestfactory

假设我有一个实体“MyUser”,我不想将所有逻辑存储在那里。据我所知,我可以将逻辑添加到服务定位器中。我在请求上下文中链接了服务定位器:

@Service(value = MyUser.class, locator = MyServiceLocator.class)
public interface MyUser extends RequestContext {

    InstanceRequest<MyUserProxy, Void> setName(String name);

    Request<Void> changePasswordAndSendMail(String password);

}

并定义了这样的定位器:

public class MyServiceLocator implements ServiceLocator {
    @Override
    public Object getInstance(Class<?> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    public static void changePasswordAndSendMail(String password){

        // Do something
    }


}

但编译器抱怨:

Could not find domain method similar to myPackage.MyUser changePasswordAndSendMail(java.util.String)

有没有办法从实体中提取逻辑?

1 个答案:

答案 0 :(得分:1)

如果您希望您的逻辑位于MyUser之外,那么只需将@Service的值更改为具有该逻辑的类(我认为@ProxyFor中的问题是错误的就你而言。)

如果该类的方法不是static,那么您需要ServiceLocator来返回该类的实例。服务定位器本身除了定位包含服务方法的服务之外还做其他任何事情。

static中方法为MyUser的状态迁移,只需创建另一个类,在那里移动static方法(当然除findMyUser方法除外)和将您的@Service更改为指向新班级。

请注意,InstanceRequest方法仍然会在作为@ProxyFor的第一个类型参数引用的代理上的InstanceRequest注释所指向的类上调用实例方法。在您的示例中,setName需要是MyUser上的实例方法(假设MyUserProxy使用@ProxyFor(MyUser.class)进行注释)