【问题标题】:GWT RequerstFactory - Extract code from entity to service locatorGWT RequestFactory - 从实体中提取代码到服务定位器
【发布时间】:2014-05-15 22:22:24
【问题描述】:

假设我有一个实体“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)

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

【问题讨论】:

    标签: java gwt requestfactory


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的,我创建了一个新类,将我的 changePasswordAndSendMail() 方法移到那里并将我的 RequestContext 与 @Service(value = NewClass.class 链接到它。然后验证会找到这个方法,但是 IDE 会警告我 MyUser 中没有 setName()
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多