Изменить свойство объекта, используемого внутри вызываемого метода в Java - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть веб-приложение на Java, использующее maven в качестве механизма сборки. Рассмотрим следующий код (слишком упрощенная версия моей ситуации), где контроллер вызывает службу для выполнения какой-либо операции, и он вызывает некоторые методы DAO для выполнения некоторых действий в БД.

class MyController extends Controller {
    public ModelAndView handleRequest(... request) {
        boolean performCheck = Boolean.valueOf(request.getParameter("doCheck"));
        myService.doSomeAction(object)
        return ...; 
    } 
}

class MyService {
    public void doSomeAction(Object o){
        myDao.doSomething(o);
    }
}

class MyDao exterds HibernateDaoSuppot {
    boolean check;

    public void doSomething(Object o){
        if(check == true){
            // some action
        } else {
            // some other action
        }

    }
}

Мой вопрос: как я могу изменить значение контрольного логического значения в методе Дао, основываясь на значении, которое я получаю в контроллере, без явной передачи логического значения через все слои? Я работаю с устаревшим кодом с большим количеством бизнес-логики, и бизнес-команда не уверена в том, чтобы слишком много модифицировать существующий код. Однако я свободен добавлять любые классы или аспекты, чтобы выполнить то же самое.

Я попытался прочитать стек вызовов в методе DAO и определить логическое значение несколькими уровнями выше, но мне не нравится работать со стеком вызовов, и я боюсь, что некоторые будущие изменения в архитектуре приложения или изменения JVM могут испортить стек вызовов.

Ответы [ 4 ]

0 голосов
/ 14 ноября 2018

В вашем случае «check» является свойством MyDao, вы хотите динамически изменить его из области действия метода, это может вызвать параллельные проблемы, если вы используете один экземпляр, что не рекомендуется.

Как упомянуто вышеПользователь, вы можете использовать два экземпляра MyDao в своем приложении, один объявить с True, а другой с False, и ваш контроллер определит, какой использовать.

0 голосов
/ 14 ноября 2018

Вы можете сделать логическое значение в контроллере атрибутом частного класса, а затем использовать метод получения для доступа к его значению из Dao.

0 голосов
/ 14 ноября 2018

Вы можете добавить в вашем объекте логическое поле для переходного процесса (только для переходного процесса, если объект является постоянным объектом).

Установите значение логического значения в вашем контроллере перед передачей объекта вашему сервису. Вам даже не нужно поддерживать отдельную переменную проверки в вашем слое DAO.

Ваш контроллер может выглядеть так:

class MyController extends Controller {
    public ModelAndView handleRequest(... request) {
        object.setPerform(Boolean.valueOf(request.getParameter("doCheck"))); // object has a boolean field named 'perform'
        myService.doSomeAction(object)
        return ...; 
    } 
}

Ваш MyDao может выглядеть так:

class MyDao exterds HibernateDaoSuppot {
    //boolean check; wont need this

    public void doSomething(Object o){
        if(o.getPerform() == true){
            // some action
        } else {
            // some other action
        }
    }
}
0 голосов
/ 14 ноября 2018

Конечно, лучше всего передать логическую переменную. но вместо этого; Вы можете объявить две функции: одну для perfromCheck == true, а другую - для executeCheck == false и вызывать любую из контроллера на основе значения executeCheck.

...