Как я могу сделать вызов геттера обязательным в том же классе - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть такой код: Как я могу сделать использование метода 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("--");
       }
   }


}

Заранее спасибо за ответ.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы можете переместить поле service в суперкласс и объявить его private, чтобы предотвратить доступ к нему подкласса, оставив при этом getService() protected.

В качестве альтернативы вы можете настроитьAlfrescoService в методе @Produces, поэтому каждый, кто запрашивает инъекцию AlfrescoService, получает экземпляр, который уже настроен.

0 голосов
/ 06 февраля 2019

Внутри 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(), не будут помечены во время компиляции.
  • Согласно JavaDocs , getStackTrace() метод может быть не разрешен некоторыми SecurityManager, и некоторые виртуальные машины могут пропускать стековые фреймы в редких случаях.
  • Это может быть неэффективно, если вы делаете это для каждого запроса.
  • Если служба является bean-компонентом Spring, вам, возможно, придется разобраться с прокси-классами, чтобы найти реального вызывающего (т.е.предыдущий кадр стека до findAll() может быть сгенерированным пружиной прокси-классом.

Альтернативой может быть использование Aspect Oriented framework.Например, Spring AOP имеет ControlFlowPointcut , который можно использовать для сопоставления имени вызывающего абонента, класса и пакета.Этот подход немного более декларативен, но опирается на дополнительную библиотеку.

...