我有一个使用maven作为构建机制的Java春季Web应用程序。考虑以下代码(我的情况的过度简化版本),其中控制器调用服务以执行某些操作,然后又调用某些DAO方法来执行DB中的某些操作。
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方法中更改检查布尔值,而无需在所有层中都明确传递布尔值?我使用的是具有许多业务逻辑的遗留代码,并且业务团队没有信心对现有代码进行太多修改。但是,我可以随意添加任何类或方面来执行相同的操作。
我尝试读取DAO方法中的调用堆栈并确定上面的几层布尔值,但是我对使用调用堆栈并不满意,而且我担心将来应用程序体系结构或JVM更改可能会有所变化弄乱了调用堆栈。
答案 0 :(得分:1)
当然最好是传递布尔变量。但反而;您可以声明两个函数,一个用于perfromCheck == true,另一个用于performCheck == false,然后根据performCheck的值从控制器调用。
答案 1 :(得分:1)
您可以在对象中添加一个瞬态(仅当对象是一个持久对象时才是瞬态的)布尔字段。
在将对象传递给服务之前,在控制器中设置布尔值。 您甚至不需要在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
}
}
}
答案 2 :(得分:1)
以您的情况为例:“ check”是MyDao的属性,您想从方法范围动态更改它,如果您使用单个实例,则可能会导致并发问题,不建议这样做。
如上述用户所述,您可以在应用中使用两个MyDao实例,一个实例使用True声明,另一个实例使用False,然后由您的控制器确定要使用哪个实例。
答案 3 :(得分:0)
您可以在控制器中将布尔值设为私有类属性,然后使用getter从Dao中访问其值。