Как вызвать метод в классе обслуживания с аннотацией @transactional и @service путем отражения? - PullRequest
1 голос
/ 11 апреля 2019

Во-первых, простите мой плохой английский, я просто усердно работаю над своим английским :).

Я пытаюсь найти более простой способ установить более простую связь между внешним и внутренним интерфейсом, потому что я использую ActiveMQ в качестве промежуточного программного обеспечения, ориентированного на сообщения. Таким образом, XML-строка стала носителем запроса.

Например, внешний интерфейс отправляет запрос строки на сервер, включая имя пакета, имя класса, имя метода и список параметров, таким образом, серверу разрешается вызывать правильный метод с помощью этой информации и отправлять вызывать результат обратно в интерфейс. Это работает, но не идеально. Проблема заключается в том, что когда я пытался вызвать метод в классе обслуживания с аннотацией @Transational и @Service (что является обычной практикой для подключения к базе данных), транзакция, казалось, не открывалась, запрос и ответ оба получены просто оставил много спящего соединения в процессе работы с базой данных mysql, столько же, сколько потребителям 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 Framework вместо прокси-класса использовал класс прокси с пометкой @Transactional, чтобы помочь нам управлять транзакцией, но код (AopUtils.isAopProxy(obj)) возвращает true , так значит ли это, что объект является именно прокси-объектом, который я получил из контекста Spring? Я не очень знаком с моделью динамических агентов.

Спасибо за ваше внимание, пожалуйста, скажите мне, если я сделал что-то не так.

1 Ответ

0 голосов
/ 11 апреля 2019

Ну, я шел к этому, я бы попробовал следующий подход:

НЕ используйте BeanFactory, введите в ваш ReflectTool ApplicationContect: @Autowired private ApplicationContext applicationContext; если бины, которые вы хотите восстановить, реализуют некоторый интерфейс или расширяют класс, то, возможно, вы можете заменить эту инъекцию на Map. Весна заставит это работать

Попытайтесь получить объект нужного вам боба.

строки, которые у вас есть относительно захвата метода и выполнения, должны работать, так как это bean-компонент, вызывающий другой bean-компонент.

Надеюсь, это поможет. У меня была похожая ситуация, когда мне нужно было вызывать метод @Transactional, и я исправил аналогичным образом, как я описал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...