Java 如何制作getter';s在同一类中调用强制
我有以下代码: 我如何在getAll方法中强制使用getService()方法,这意味着如果我直接调用Java 如何制作getter';s在同一类中调用强制,java,jakarta-ee,design-patterns,annotations,java-7,Java,Jakarta Ee,Design Patterns,Annotations,Java 7,我有以下代码: 我如何在getAll方法中强制使用getService()方法,这意味着如果我直接调用service.findAll()编译失败 是否可以创建注释以禁止直接使用该字段 @Named @Profile("default") public class AlfrescoVersionServiceImpl { @Inject //Request Scope service private AlfrescoService service; @Resource
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("--");
}
}
}
@Named
@配置文件(“默认”)
公共类户外服务MPL{
@注入
//请求范围服务
私人户外服务;
@资源
私有WebServiceContext WebServiceContext;
公共列表getAll(){
返回getService().findAll();
}
公共户外服务{
service.setenpointaddress(“--”);
if(webServiceContext.isUserInRole(角色)){
service.setRole(“--”);
}
}
}
提前感谢您的回复 在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(){
StackTraceElement[]stack=Thread.getStackTrace();
如果(堆栈长度>1){
//stack[0]是我们自己,stack[1]是呼叫我们的人
如果(堆栈[1].getClassName().equals(…)&堆栈[1].getMethodName().equals(…){
//执行业务逻辑
}
}
}
请注意以下几点:
- 这是一个运行时检查,因此调用
的方法不会在编译时被标记findAll()
- 根据,某些SecurityManager可能不允许使用
方法,并且在极少数情况下,某些VM可能会忽略堆栈帧getStackTrace()
- 如果对每个请求都执行此操作,则可能无法执行此操作
- 如果服务是一个Springbean,您可能需要处理通过代理类进行排序以找到真正的调用方(即
之前的前一个堆栈帧可能是Spring生成的代理类)findAll()
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(){
StackTraceElement[]stack=Thread.getStackTrace();
如果(堆栈长度>1){
//stack[0]是我们自己,stack[1]是呼叫我们的人
如果(堆栈[1].getClassName().equals(…)&堆栈[1].getMethodName().equals(…){
//执行业务逻辑
}
}
}
请注意以下几点:
- 这是一个运行时检查,因此调用
的方法不会在编译时被标记findAll()
- 根据,某些SecurityManager可能不允许使用
方法,并且在极少数情况下,某些VM可能会忽略堆栈帧getStackTrace()
- 如果对每个请求都执行此操作,则可能无法执行此操作
- 如果服务是一个Springbean,您可能需要处理通过代理类进行排序以找到真正的调用方(即
之前的前一个堆栈帧可能是Spring生成的代理类)findAll()
但是依赖于一个额外的库。您可以将
服务
字段移动到一个超类中,并将其声明为私有
,以防止子类访问它,同时保持getService()
受保护
或者,您可以在
@products
方法中配置AlfrescoService
,这样要求注入AlfrescoService
的每个人都会得到一个已经配置好的实例。您可以将service
字段移动到一个超类中,并声明它为private
,以防止当保持getService()
受保护时,阻止子类访问它
或者,您可以在@products
方法中配置AlfrescoService
,这样每个要求注入AlfrescoService
的人都会得到一个已经配置好的实例。您的问题会更深:修改共享服务不是线程安全的。@meriton服务的范围是请求,NO请回答?您的问题更深:修改共享服务不是线程安全的。@meriton服务的范围是请求,请不要回答?