Java Sprint-Boot: не удалось получить доступ к @Bean, определенному в @Configuration - PullRequest
1 голос
/ 06 февраля 2020

Я определил Bean-компонент, подобный этому, в классе конфигурации Spring-boot (с примечанием @ Configuration ) класса:

@Bean
public MyRegistry myRegistry() {
    return new MyRegistry();
}

MyRegistry выглядит следующим образом:

@Component
@Getter
@Setter
public class MyRegistry {
    Map<String, Object> resourcesMap = new HashMap<>();

    public MyRegistry() {
        resourcesMap.put("handler1", new MyHandler1());
        resourcesMap.put("handler2", new MyHandler2());
    }
}

Теперь в другом классе с @ Component у меня есть @ Autowire d myRegistry и использую его, как показано ниже:

MyHandler1 handler1 = new ObjectMapper().convertValue(myRegistry.getResourcesMap().get("handler1"), MyHandler1.class);

Я не получаю никаких ошибка при запуске приложения Spring-Boot, но когда приложение работает, методы Handler1 недоступны.

Хотите понять, что я делаю не так здесь. Я, вероятно, испортил использование аннотаций, поскольку я новичок в Spring-Boot

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Итак, работает следующий код (snippet1)?

Object mHandler1Obj = myRegistry.getResourcesMap().get("handler1", MyHandler1.class);

Но когда он пытается (snippet2), происходит сбой:

MyHandler1 handler1 = new ObjectMapper().convertValue(myHandler1Obj);

Если так, то весенняя загрузка здесь не имеет значения, тот факт, что «snippet1» работал, уже показывает, что весенняя загрузка выполнила свою работу.

Теперь его объект-преобразователь, который не может преобразовать объект generic c в MyHandler1 ...

Чтобы воспроизвести его, попробуйте «исключить» загрузочную пружину из уравнения и проверить только фрагмент 2.

Этот BTW может объяснить, почему контекст приложения (приложение весенней загрузки) запускался без исключений: если он может ' При автоматическом запуске что-то не получится, но, как вы объясните, дело не в этом ...

0 голосов
/ 06 февраля 2020

Вы уже определили MyRegistry как bean-компонент с помощью @Component, вам не нужно создавать bean-компонент с помощью @Configuration, если вы не хотите создавать несколько bean-компонентов.

Я пробовал приведенный ниже код, и я надеюсь, что он работает это будет полезно.

MyRegistry. java

@Component
public class MyRegistry {

   private Map<String, Object> resource = new HashMap<>();

    public MyRegistry() {
        this.resource.put("handler", new MyHandler());
    }

    public Map<String, Object> getResource() {
        return resource;
    }
}

MyHandler. java

public class MyHandler {

    private String message;

    public MyHandler() {
        this.message = "Hello world";
    }
}

TestBean. java

@Autowired
private MyRegistry myRegistry;

@Override
public void test() throws Exception {
   MyHandler handler = new ObjectMapper().convertValue(myRegistry.getResource().get("handler"), MyHandler.class);
    System.out.printf("message "+ handler.getMessage());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...