假设我有一个实体“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)
有没有办法从实体中提取逻辑?
答案 0 :(得分:1)
如果您希望您的逻辑位于MyUser
之外,那么只需将@Service
的值更改为具有该逻辑的类(我认为@ProxyFor
中的问题是错误的就你而言。)
如果该类的方法不是static
,那么您需要ServiceLocator
来返回该类的实例。服务定位器本身除了定位包含服务方法的服务之外还做其他任何事情。
从static
中方法为MyUser
的状态迁移,只需创建另一个类,在那里移动static
方法(当然除findMyUser
方法除外)和将您的@Service
更改为指向新班级。
请注意,InstanceRequest
方法仍然会在作为@ProxyFor
的第一个类型参数引用的代理上的InstanceRequest
注释所指向的类上调用实例方法。在您的示例中,setName
需要是MyUser
上的实例方法(假设MyUserProxy
使用@ProxyFor(MyUser.class)
进行注释)