簡體   English   中英

如何通過反射調用帶有@transactional和@service批注的服務類中的方法?

[英]How to invoke a method in a service class with @transactional and @service annotation by reflection?

首先,請原諒我的英語不好,我只是在努力學習英語。

我試圖找到一種簡單的方法來設置前端和后端之間的通信更為簡單,因為我將ActiveMQ用作面向消息的中間件。 因此XML字符串成為了請求的載體。

例如,前端向后端發送一個字符串請求,包括程序包名稱,類名稱,方法名稱和參數列表,這樣,后端就可以通過這些信息來調用正確的方法,然后將調用結果發送回到前端。 它有效,但並不完美。 問題是,當我嘗試使用@Transational@Service注釋(這是連接數據庫的常見做法)在服務類中調用方法時,事務似乎沒有打開,請求和響應都被接收到,每次與ActiveMQ的使用者一樣,在mysql數據庫進程中留下了很多睡眠連接。

在此處輸入圖片說明

服務類中的目標方法:

@Service
@Transactional
public class UserService {
    @Autowired
    private IUserDAO udao;

    public User getUserByName(String username) {
        return udao.findByUsername(username);
    }
}

調用方法(省略了一些代碼):

@Component
public class ReflectTool {
    public Object invokeMethod(String packageName,String className,String methodName,List paramList) {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml");
        Object obj = beanFactory.getBean(packageName+"."+className);
        Class cla = obj.getClass();
        Method method = findMethod(Class cla,String methodName);
        return method.invoke(obj, params);
    }
}

我搜索了很多答案,但沒有一個起作用。 就像:使用代理對象而不是目標對象來調用,因為spring框架使用了具有@Transactional批注的代理類而不是服務類來幫助我們管理事務,但是代碼( AopUtils.isAopProxy(obj) )返回true ,是否意味着該對象正是我從spring上下文中獲得的代理對象? 我對Dynamic Agent Model不太熟悉。

感謝您的關注,如果我做錯了,請告訴我。

好吧,我正要嘗試以下方法:

不要使用BeanFactory,在ReflectTool中插入ApplicationContect:@Autowired私有ApplicationContext applicationContext; 如果要恢復的bean實現了某個接口或擴展了一個類,則可以用Map替換此注入。 春天會使它工作

嘗試獲取所需的bean對象。

關於該方法的捕獲和執行的代碼行應該起作用,因為它是一個調用另一個bean的bean。

希望這可以幫助。 我遇到了類似的情況,我需要調用@Transactional方法,並以與上述類似的方式進行修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM