gpt4 book ai didi

java - 如何通过反射调用带有@transactional和@service注解的服务类中的方法?

转载 作者:太空宇宙 更新时间:2023-11-04 09:44:12 26 4
gpt4 key购买 nike

首先,请原谅我糟糕的英语,我只是在努力提高我的英语:)。

我试图找到一种简单的方法来设置前端和后端之间的通信更简单,因为我使用ActiveMQ作为面向消息的中间件。于是XML字符串就成了请求的载体。

例如,前端向后端发送一个字符串请求,其中包括包名、类名、方法名和参数列表,这样后端就可以根据这些信息调用正确的方法,并将调用结果返回给前端。它有效,但并不完美。问题是,当我尝试使用 @Transational@Service 注解调用服务类中的方法时(这是连接数据库的常见做法),事务似乎没有打开,请求和响应都收到了,只是在 mysql 数据库进程中留下了大量 hibernate 连接,每次都与 ActiveMQ 的消费者一样多。

enter image description here

服务类中的目标方法:

@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上下文中获取的代理对象?我对动态代理模型不是很熟悉。

感谢您的关注,如果我做错了什么,请告诉我。

最佳答案

好吧,我打算尝试以下方法:

不要使用 BeanFactory,在 ReflectTool 中注入(inject) ApplicationContect:@Autowired private ApplicationContext applicationContext;如果您想要恢复的 bean 实现了某个接口(interface)或扩展了一个类,那么也许您可以用 Map 来替换此注入(inject)。 Spring 会让它发挥作用

尝试获取您需要的bean的对象。

关于捕获方法和执行的行应该有效,因为它是一个调用另一个 bean 的 bean。

希望这有帮助。我遇到过类似的情况,我需要调用 @Transactional 方法,并以我所描述的类似方式修复。

关于java - 如何通过反射调用带有@transactional和@service注解的服务类中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com