Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每次使用子类中的方法时调用父类中的方法_Java_Spring_Inheritance_Saas - Fatal编程技术网

Java 每次使用子类中的方法时调用父类中的方法

Java 每次使用子类中的方法时调用父类中的方法,java,spring,inheritance,saas,Java,Spring,Inheritance,Saas,我陷入了这样一种情况:有许多Action类,它们都是从父类TPDispatchAction扩展而来的。现在,我必须在每次调用任何操作方法时基本上设置一个会话Springbean,其中我设置了用户的租户id 粗略的方法是在所有操作类的所有操作方法中添加设置值的代码行 有没有更好的办法 编辑 使用MethodBeforeAdvice AOP解决了问题。您可能希望在超类中创建一个方法,如 //super class A A { public foo(){ //create her

我陷入了这样一种情况:有许多Action类,它们都是从父类TPDispatchAction扩展而来的。现在,我必须在每次调用任何操作方法时基本上设置一个会话Springbean,其中我设置了用户的租户id

粗略的方法是在所有操作类的所有操作方法中添加设置值的代码行

有没有更好的办法

编辑


使用MethodBeforeAdvice AOP解决了问题。您可能希望在超类中创建一个方法,如

  //super class A
  A {

  public foo(){
    //create here whatever you want
    bar(); 
  }

  protected bar();
  }


  //extending class/action
  B:A{

    bar(){
      //your implementation
    }

  }
它的调用是由所有其他子类实现的另一个方法


外部对象只需调用并查看foo方法,您就可以在那里访问您的初始化或后处理。

您可以在前面放置一个拦截器来设置会话范围中的bean。尝试实施

org.springframework.web.servlet.HandlerInterceptor

对请求处理场景进行预处理和后处理。您可以在prehandle方法中设置
tenantID
建议使用PostConstruct注入

@PostConstruct
void initializeCommon() {
    //set values here
 }

我使用Spring AOP
MethodBeforeAdvice解决了我的问题

public void before(Method methodName, Object[] arguments, Object arg2)
            throws Throwable {
}
在这种情况下,
methodName
是被调用的方法的名称
arguments
是该方法的参数列表,
arg2
是返回的对象。因此,由于HTTPRequest对象是我的操作方法中的对象之一,所以我能够使用参数并捕获会话。 (基本上,我已将Spring集成到基于Struts 1.3的项目中)

在applicationContext.xml中

<bean name="globalInterceptor"
    class="com.xyz.common.filters.GlobalRequestInterceptor"></bean>
<bean name="autoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
        <list>
            <value>*</value>
        </list>
    </property>
    <property name="interceptorNames">
        <list>
            <value>globalInterceptor</value>                
        </list>
    </property>
</bean>

*
球受体

因此,这基本上截取了所有服务bean中的所有方法调用。

您想在调用操作方法时在
会话中设置bean吗?不,它实际上是一个具有会话范围的bean,我在其中设置了变量“tenantid”。请参阅我的答案-使用截取器会有所帮助,但在这种情况下,我必须实现它bar()在所有子类中都是重复的,因为代码行在任何地方都是精确的。我还必须从子类中的所有方法调用bar()函数,这不会减少工作量。听起来很有趣。让我看看!我不接受这个答案,因为我的问题是使用AOP before()方法beforeadvice解决的。但是你的回答确实帮助我朝着正确的方向出发。好吧,你应该发布你自己的答案并接受它。这将有助于解决类似的问题。