Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Jar библиотека, использование внешних классов / 2 сообщений из 2, страница 1 из 1
03.06.2019, 10:30
    #39821522
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jar библиотека, использование внешних классов
Всем привет!

Приложение Spring Boot 2.1.5 на Tomcat 8.5. Приложение использует jar-библиотеку, через которую выбирает нужную реализацию.
Есть одна встроенная реализация сохранения в файл: класс "com.company.scjms.ListenerToFile", который находится в jar-нике.
Через "registrateMessageAsyncConsumerFactory()" можно добавлять новые реализации:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
package com.company.scjms;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
public class ListenerFactory {

    private static final String exceptionConsumerInstance 
            = "Failed get message async consumer instance";
    
    private static Map<String, String> listenerMap = new HashMap<>();
    
    static {
        listenerMap.put(
                "defaultListener", 
                "com.company.scjms.ListenerToFile");
    }
    
    public static AsyncConsumer getInstance(
            String messageAsyncConsumerShortName) 
            throws MessageServiceException {
        try {
            Class clazz = Class.forName(
                    listenerMap.get(messageAsyncConsumerShortName));
            return (AsyncConsumer) clazz.getConstructor().newInstance();
        } catch (ClassNotFoundException
                | NoSuchMethodException
                | SecurityException
                | InstantiationException
                | IllegalAccessException
                | IllegalArgumentException
                | InvocationTargetException ex) {
            throw new MessageServiceException(exceptionConsumerInstance, ex);
        }
    }
    
    public static void registrateMessageAsyncConsumerFactory(
            String shortName,
            String className) {
        listenerMap.put(shortName, className);
    }
    
}


Возникает необходимость в самом Spring Boot приложении добавить новую реализацию, например, запись в БД:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
package com.company.scjmslistener;

@Component
public class Consumer {
    
    private MessageService messageService;
    private final String shortName = "MariaDB";
    private final String className 
            = "com.company.scjmslistener.ListenerToDB";
    
    @PostConstruct
    public void init() {
        ListenerFactory.registrateMessageAsyncConsumerFactory(
                shortName, 
                className);
      ...        
    }
    
}


При попытке вернуть экземпляр класса "ListenerToDB" через "public static AsyncConsumer getInstance()" возникает ошибка:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'consumer': Invocation of init method failed; nested exception is java.lang.RuntimeException: com.company.scjms.MessageServiceException: Failed get message async consumer instance
Caused by:  com.company.scjms.MessageServiceException: Failed get message async consumer instance
	at  com.company.scjms.ListenerFactory.getInstance(ListenerFactory.java:34) ~[scjms-1.07.jar:na]
	at  com.company.scjms.ActiveMQMessageService.connect(ActiveMQMessageService.java:142) ~[scjms-1.07.jar:na]
	at  com.company.scjmslistener.Consumer.init(Consumer.java:50) ~[classes/:na]
	... 60 common frames omitted
Caused by: java.lang.NoSuchMethodException:  com.company.scjmslistener.ListenerToDB.<init>()
	at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_212]
	at java.lang.Class.getConstructor(Class.java:1825) ~[na:1.8.0_212]
	at  com.company.scjms.ListenerFactory.getInstance(ListenerFactory.java:26) ~[scjms-1.07.jar:na]
	... 62 common frames omitted

Как я понимаю jar-ник не может найти класс "com.company.scjmslistener.ListenerToDB", как минимум потому что новый класс находится в другом пакете.

Куда и в каком виде нужно положить мою новую реализацию класс "com.company.scjmslistener.ListenerToDB", чтобы jar-ник видел его и возвращал его экземпляр?
...
Рейтинг: 0 / 0
03.06.2019, 15:08
    #39821737
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jar библиотека, использование внешних классов
Molasar,

Вообще, судя по NoSuchMethodException, в ListenerToDB нет публичного конструктора без параметров
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Jar библиотека, использование внешних классов / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]