我有这样的代码:我如何才能让使用的getService()方法在GETALL梅索德强制性的,这意味着如果我直接打电话service.findAll()
编译失败?
是否有可能创建一个注释,禁止直接使用的字段?
@Named
@Profile("default")
public class AlfrescoVersionServiceImpl {
@Inject
//Request Scope service
private AlfrescoService service;
@Resource
private WebServiceContext webServiceContext;
public List<Fichier> getAll(){
return getService().findAll();
}
public AlfrescoService getService(){
service.setEnPointAdress("--");
if(webServiceContext.isUserInRole(role)){
service.setRole("--");
}
}
}
预先感谢您的回复。
您可以在service
区域移动到一个超类,并声明其private
防止子类进行访问,同时保持getService()
protected
。
另外,您也可以配置在AlfrescoService
方法@Produces
,所以大家要求被注入的AlfrescoService
获取已配置的实例。
里面findAll()
你可以使用Thread.getStackTrace()
检查当前的堆栈跟踪并确保以前的StackTraceElement
是你想要的类和方法:
public List<Fichier> findAll() {
StackTraceElement[] stack = Thread.getStackTrace();
if(stack.length > 1) {
// stack[0] is ourselves, stack[1] is who called us
if(stack[1].getClassName().equals(...) && stack[1].getMethodName().equals(...) {
// execute the business logic
}
}
}
只是要注意的几件事情:
findAll()
方法不会在编译时被标记。getStackTrace()
方法可能不被一些SecurityManagers允许的,并且某些VM可能在罕见的情况下省略堆栈帧。findAll()
可以是弹簧产生的代理类)。另一种方法是使用一个面向方面的框架。例如,Spring AOP具有可用于匹配呼叫者姓名,班级,和包ControlFlowPointcut。这种方法是多一点的声明,而是依赖于额外的库。