Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Autowired bean is null  [new]
Molasar
Member

Откуда:
Сообщений: 829
Всем привет!

Почему объект testBean равен null в методе ExecutorListener.contextInitialized()?

@Service
public class TestBean {

    private String name;
    
    @PostConstruct
    private void init() {
        this.name = "My name";
    }

    public String getName() {
        return name;
    }
    
}

@WebListener
public class ExecutorListener implements ServletContextListener {

    @Autowired
    private TestBean testBean;

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println(testBean.getName());
    }

}


автор
08-Sep-2020 10:05:31.829 SEVERE [http-nio-8080-exec-6] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [com.example.beantester.ExecutorListener]
java.lang.NullPointerException
at com.example.beantester.ExecutorListener.contextInitialized(ExecutorListener.java:24)
8 сен 20, 10:15    [22193377]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1797
Molasar,
Потому что autowired не сделался. По моему TestBean можно засунуть агрументом в метод и сделать его @AutoWired, но это - не точно.
8 сен 20, 10:51    [22193405]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Molasar
Member

Откуда:
Сообщений: 829
Чтобы сработал @Autowired, нужно сделать вот так:

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        WebApplicationContextUtils
            .getRequiredWebApplicationContext(sce.getServletContext())
            .getAutowireCapableBeanFactory()
            .autowireBean(this);

        System.out.println(testBean.getName());
    }
8 сен 20, 11:17    [22193425]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5596
Molasar,

Потому что JavaEE/JakartaEE можно засунуть в Spring, а наоборот нужно извратиться. :-)

Сделайте свой бин TestBin бином JavaEE/JakartaEE.
Аннотации @Statefull, @Stateless, @Singlton. Обращаться через @Inject ( а не @Autowired)

Ну или используйте только Spring :-)
8 сен 20, 12:37    [22193500]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
Похожая ситуация
Это работает
@Controller
public class UserController {

    @Autowired
    ServiceUserDB serviceUserDB;


А это нет, объект NULL
@Component
public class SecurityHandler implements AuthenticationSuccessHandler {

    @Autowired
    ServiceUserDB serviceUserDB;


Все дело в наследовании или в @Controller и @Component?
3 ноя 20, 10:08    [22225506]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5596
SQL2008
Похожая ситуация
...
Все дело в наследовании или в @Controller и @Component?


А если попробовать не через аннотацию @Controller, а через класс @Сonfig и @Bean ?

И инжекцию сделать через конструктор, а не через поле.

Хотя вообще-то странно.
По идее @Component должен при загрузку приложения падать (ну или в логах ругнуться).
С ошибкой создания бина.
3 ноя 20, 12:16    [22225576]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
mad_nazgul
А если попробовать не через аннотацию @Controller, а через класс @Сonfig и @Bean ? И инжекцию сделать через конструктор, а не через поле.

Хочется чтобы все было в едином стиле.
И чисто академически интересует этот вопрос - почему в одном месте работает, а в другом нет?
Чего я не понимаю?
3 ноя 20, 19:20    [22225930]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Lelouch
Member

Откуда: Москва
Сообщений: 1879
SQL2008,

А каким образом securityHandler создаётся?
3 ноя 20, 22:16    [22226015]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5596
SQL2008
mad_nazgul
А если попробовать не через аннотацию @Controller, а через класс @Сonfig и @Bean ? И инжекцию сделать через конструктор, а не через поле.

Хочется чтобы все было в едином стиле.
И чисто академически интересует этот вопрос - почему в одном месте работает, а в другом нет?
Чего я не понимаю?


Чтобы понять, нужно глубоко разбираться в жизненном цикле бинов.
И там есть куча неоднозначного поведения, в зависимости от того как создаются бины.

Т.к. по двум классам нельзя понять как поднимается Spring-context, то сказать почему - не возможно.


Пока посмотрите как создается бин SecurityHandler и где он используется.

А так рекомендую мигрировать с аннотаций, на @Config клаассы и инжекцию через конструктор.

1) Легче будет писать Unit-тесты, без поднятия всего контекста
2) Вся "грязь" будет в специально отведенном загончике
3) Можно будет отлаживать поднятие контекста
4 ноя 20, 06:50    [22226106]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mad_nazgul
есть куча неоднозначного поведения, в зависимости от того как создаются бины.
именно. И это есть декларативное программирование вместо obj = new Class.
Свои плюсыминусы
4 ноя 20, 09:18    [22226123]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
Lelouch
SQL2008,

А каким образом securityHandler создаётся?


В application-context.xml
 <bean id="myAuthenticationSuccessHandler"
          class="bla.bla.bla.SecurityHandler" />


А потом прописывается в security-config.xml
<form-login login-page="/login.html" authentication-success-handler-ref="myAuthenticationSuccessHandler"
                    username-parameter="username"
                    password-parameter="password"
                    login-processing-url="/j_spring_security_check"
                    authentication-failure-url="/login.html?error=true" />


Причем все работает, управление после успешной авторизации получает.
Но внутри не могу связать bean
4 ноя 20, 18:04    [22226348]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mad_nazgul


А так рекомендую мигрировать с аннотаций, на @Config клаассы и инжекцию через конструктор.

1) Легче будет писать Unit-тесты, без поднятия всего контекста
2) Вся "грязь" будет в специально отведенном загончике
3) Можно будет отлаживать поднятие контекста


Конструктор это полнейшая шляпа для инжекта

плюсы- простое написание юнит тестов

минусы- все остальное

у меня класс 200+ полей например( что по сути обычная практика в ентерпрайзе) какие то поля обязательны,какие то нет-когда какие будут я не знаю- как я по твоему буду конструкторы оформлять делать 200*200 конструктров под каждый вариант?

меня больше всего веселит ,что мне уже и идея начинает подчеркивать @Autowired поля
4 ноя 20, 18:27    [22226353]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
SQL2008
Lelouch
SQL2008,

А каким образом securityHandler создаётся?


В application-context.xml
 <bean id="myAuthenticationSuccessHandler"
          class="bla.bla.bla.SecurityHandler" />


А потом прописывается в security-config.xml
<form-login login-page="/login.html" authentication-success-handler-ref="myAuthenticationSuccessHandler"
                    username-parameter="username"
                    password-parameter="password"
                    login-processing-url="/j_spring_security_check"
                    authentication-failure-url="/login.html?error=true" />


Причем все работает, управление после успешной авторизации получает.
Но внутри не могу связать bean

а зачем ты ставишь компонент над классом который ты уже записал в бины ,причем с другим названием в контекст-соотвственно и далее ты подставляешь этот бин из контекста в сприг секурити,не понятно что ты хотел в итоге то получить= так как @component эта та анотация ,видя которую спринг при скане пакетов - создает бин и кладет его в контекст,а тут у тебя один и тот же класс два раза кладется в контекст судя по всему

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

Сообщение было отредактировано: 4 ноя 20, 18:53
4 ноя 20, 18:54    [22226363]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
Zzz79
а зачем ты ставишь компонент над классом который ты уже записал в бины ,причем с другим названием в контекст

Удаление @Component никак не повлияло, также не работает!
4 ноя 20, 18:59    [22226366]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
SQL2008
Zzz79
а зачем ты ставишь компонент над классом который ты уже записал в бины ,причем с другим названием в контекст

Удаление @Component никак не повлияло, также не работает!

а что именно не работает?
4 ноя 20, 19:01    [22226369]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
Zzz79, не биндится объект, остается NULL
    @Autowired
    ServiceUserDB serviceUserDB;
4 ноя 20, 19:07    [22226372]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
SQL2008


Все дело в наследовании или в @Controller и @Component?

For all these annotations (stereotypes), technically the core purpose is same. Spring automatically scans and identifies all these classes that are annotated with “ @Component, @Service, @Repository, @Controller” and registers BeanDefinition with ApplicationContext
4 ноя 20, 19:08    [22226373]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
Взял пример отсюда
4 ноя 20, 19:10    [22226375]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
SQL2008,

смотри у тебя этот класс есть
ты из него пытаешься два раза создать бин
так как ты юзаешь тот бин,котоРЫЙ ты проптисал в xml ,соотвествено все работает ,но дебагером в коде ты будешь видеть там нул
а вот убери ты из контекста его и там сразу заработает)
4 ноя 20, 19:26    [22226378]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
вообще весь код очень странный - если ты юзаешь анотации то и юзай их
если ты юзаешь xml то юзай его
по итогу у тебя каша из бинов ,хотя надо посмотреть все целиком -какой конфиг ты прописал

пс но в общем и целом - это сейчас никто не использует - эти знания = мусор
достаточно понимаания как в контекст попадают бины и как достаются ну и собственно их скоуп
4 ноя 20, 19:29    [22226381]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
Zzz79
а вот убери ты из контекста его и там сразу заработает)

Ещё раз для тех кто с бронепоезда - что нужно сделать?
4 ноя 20, 19:42    [22226384]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
SQL2008
Zzz79
а вот убери ты из контекста его и там сразу заработает)

Ещё раз для тех кто с бронепоезда - что нужно сделать?

либо оствить xml based configuration
либо anotation
что оставишь решать тебе
4 ноя 20, 19:47    [22226390]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
Zzz79, почему в другом классе работает?
4 ноя 20, 19:52    [22226395]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
SQL2008
Zzz79, почему в другом классе работает?

может в контексте прописано- ты пойми так сложно понять почему там нулл
точней так то понятно - не работает @AutoWired
почемУ -вопрос общий слишком- нужно видеть целиком код
4 ноя 20, 19:59    [22226400]     Ответить | Цитировать Сообщить модератору
 Re: Autowired bean is null  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
Zzz79, спрошу по другому.
Я правильно понимаю, что @Autowired это типа ссылка (+конструктор) на некий общий объект?
Можно-ли использовать его из разных классов?
4 ноя 20, 20:03    [22226404]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Java Ответить