Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Autowired bean is null / 25 сообщений из 43, страница 1 из 2
08.09.2020, 10:15
    #39996448
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Всем привет!

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Service
public class TestBean {

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

    public String getName() {
        return name;
    }
    
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@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)
...
Рейтинг: 0 / 0
08.09.2020, 10:51
    #39996460
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Molasar,
Потому что autowired не сделался. По моему TestBean можно засунуть агрументом в метод и сделать его @AutoWired, но это - не точно.
...
Рейтинг: 0 / 0
08.09.2020, 11:17
    #39996469
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Чтобы сработал @Autowired, нужно сделать вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        WebApplicationContextUtils
            .getRequiredWebApplicationContext(sce.getServletContext())
            .getAutowireCapableBeanFactory()
            .autowireBean(this);

        System.out.println(testBean.getName());
    }
...
Рейтинг: 0 / 0
08.09.2020, 12:37
    #39996504
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Molasar,

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

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

Ну или используйте только Spring :-)
...
Рейтинг: 0 / 0
03.11.2020, 10:08
    #40014736
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Похожая ситуация
Это работает
Код: java
1.
2.
3.
4.
5.
@Controller
public class UserController {

    @Autowired
    ServiceUserDB serviceUserDB;



А это нет, объект NULL
Код: java
1.
2.
3.
4.
5.
@Component
public class SecurityHandler implements AuthenticationSuccessHandler {

    @Autowired
    ServiceUserDB serviceUserDB;



Все дело в наследовании или в @Controller и @Component?
...
Рейтинг: 0 / 0
03.11.2020, 12:16
    #40014784
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
SQL2008
Похожая ситуация
...
Все дело в наследовании или в @Controller и @Component?


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

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

Хотя вообще-то странно.
По идее @Component должен при загрузку приложения падать (ну или в логах ругнуться).
С ошибкой создания бина.
...
Рейтинг: 0 / 0
03.11.2020, 19:20
    #40015011
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
mad_nazgul
А если попробовать не через аннотацию @Controller, а через класс @Сonfig и @Bean ? И инжекцию сделать через конструктор, а не через поле.

Хочется чтобы все было в едином стиле.
И чисто академически интересует этот вопрос - почему в одном месте работает, а в другом нет?
Чего я не понимаю?
...
Рейтинг: 0 / 0
03.11.2020, 22:16
    #40015076
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
SQL2008,

А каким образом securityHandler создаётся?
...
Рейтинг: 0 / 0
04.11.2020, 06:50
    #40015136
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
SQL2008
mad_nazgul
А если попробовать не через аннотацию @Controller, а через класс @Сonfig и @Bean ? И инжекцию сделать через конструктор, а не через поле.

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


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

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


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

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

1) Легче будет писать Unit-тесты, без поднятия всего контекста
2) Вся "грязь" будет в специально отведенном загончике
3) Можно будет отлаживать поднятие контекста
...
Рейтинг: 0 / 0
04.11.2020, 09:18
    #40015147
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
mad_nazgul
есть куча неоднозначного поведения, в зависимости от того как создаются бины.
именно. И это есть декларативное программирование вместо obj = new Class.
Свои плюсыминусы
...
Рейтинг: 0 / 0
04.11.2020, 18:04
    #40015268
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Lelouch
SQL2008,

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


В application-context.xml
Код: java
1.
2.
 <bean id="myAuthenticationSuccessHandler"
          class="bla.bla.bla.SecurityHandler" />



А потом прописывается в security-config.xml
Код: java
1.
2.
3.
4.
5.
<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
...
Рейтинг: 0 / 0
04.11.2020, 18:59
    #40015282
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Zzz79
а зачем ты ставишь компонент над классом который ты уже записал в бины ,причем с другим названием в контекст

Удаление @Component никак не повлияло, также не работает!
...
Рейтинг: 0 / 0
04.11.2020, 19:07
    #40015286
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Zzz79, не биндится объект, остается NULL
Код: java
1.
2.
    @Autowired
    ServiceUserDB serviceUserDB;
...
Рейтинг: 0 / 0
04.11.2020, 19:10
    #40015288
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Взял пример отсюда
...
Рейтинг: 0 / 0
04.11.2020, 19:42
    #40015295
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Zzz79
а вот убери ты из контекста его и там сразу заработает)

Ещё раз для тех кто с бронепоезда - что нужно сделать?
...
Рейтинг: 0 / 0
04.11.2020, 19:52
    #40015300
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Zzz79, почему в другом классе работает?
...
Рейтинг: 0 / 0
04.11.2020, 20:03
    #40015304
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Zzz79, спрошу по другому.
Я правильно понимаю, что @Autowired это типа ссылка (+конструктор) на некий общий объект?
Можно-ли использовать его из разных классов?
...
Рейтинг: 0 / 0
05.11.2020, 06:39
    #40015399
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Zzz79
в твоем случае у тебя изначально два бина одного класса с разными Id
используется тот ,что ты запихал в хмл
а то что у тебя в коде там прописано спрингу пофиг если не указана анотайшн бейсед конфиг

Это мне нужно осмыслить.
...
Рейтинг: 0 / 0
05.11.2020, 06:53
    #40015400
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
SQL2008

В application-context.xml
Код: java
1.
2.
 <bean id="myAuthenticationSuccessHandler"
          class="bla.bla.bla.SecurityHandler" />



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


Ну дык правильно!
Вы его в xml-конфиге не заинжектили!

Надо так:

Код: java
1.
2.
3.
4.
 <bean id="myAuthenticationSuccessHandler"
          class="bla.bla.bla.SecurityHandler" >
        <property name="testBean" value="testBinRef" />
</bean>



P.S.используйте один стиль описания/создания бинов.
Если используете xml-конфиги, то создавайте бины только там, без аннотаций .
Если используете аннотации, то не создавайте бины в xml-конфиге.
В противном случае будете много времени тратить на танцы с бубном вокруг spring-context'а
...
Рейтинг: 0 / 0
05.11.2020, 08:22
    #40015417
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
mad_nazgul

Надо так:

Код: java
1.
2.
3.
4.
 <bean id="myAuthenticationSuccessHandler"
          class="bla.bla.bla.SecurityHandler" >
        <property name="testBean" value="testBinRef" />
</bean>



И обратно не понимаю!
Вот весь мой класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class SecurityHandler implements AuthenticationSuccessHandler {

    @Autowired
    ServiceUserDB serviceUserDB;

    public void onAuthenticationSuccess(HttpServletRequest request,   HttpServletResponse response, Authentication authentication) throws IOException  {
        Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
        String email = ((UserDetails)authentication.getPrincipal()).getUsername();
        Session.userDetail = serviceUserDB.gelUserDetail(email);
        response.sendRedirect("index.html");
    }
}



Какое проперти я должен тут устанавливать, если их нет в принципе?
...
Рейтинг: 0 / 0
05.11.2020, 08:38
    #40015422
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
SQL2008

Какое проперти я должен тут устанавливать, если их нет в принципе?


Как нет?!
А

Код: java
1.
2.
@Autowired
    ServiceUserDB serviceUserDB;



Это что?

Сейчас у вас в приложении вы создали бин, но свойства в него не заинжектили.

Если вы создаёте бин через xml, то нужные проперти вы должны прямо указать, что в них положить.
Если через аннотации, то, да - там магия. Spring сам анйдет и заинжектит что надо.

Поэтому или штаны оденьте, или крестик снимите.

Т.е. создавайте бины или через xml, или через аннотации.

А так (скорее всего) у вас в контексте два бина.
Первый который создался в xml без инициализированного проперти, а второй, который создался через аннотации с инициализированным проперти.

Причем в "form login" вы используете бин который создали в xml.

Так что либо "не думаете" и инициализируете проперти в xml, либо учите жизненный цикл бинов до полного простветления. :-)
...
Рейтинг: 0 / 0
05.11.2020, 13:04
    #40015526
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
mad_nazgul, спасибо за потраченное на меня время!
Если смогу чем-то быть полезен, то с радостью помогу.
Теперь по теме
Перевести все в аннотации не получилось, сделал через XML.

Так что либо "не думаете" и инициализируете проперти в xml, либо учите жизненный цикл бинов до полного просветления. :-)
Пока пошел первым способом, но со вторым мне нужно тоже определяться.
Еще раз спасибо!
...
Рейтинг: 0 / 0
07.11.2020, 10:51
    #40016181
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Zzz79,
Сразу на спринг бут нельзя переходить. Это бейсик.
Вы тут с аннотациями сначала закончите.
Чем плохи аннотации?
...
Рейтинг: 0 / 0
08.11.2020, 19:12
    #40016365
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
PetroNotC Sharp
Zzz79,
Сразу на спринг бут нельзя переходить. Это бейсик.
Вы тут с аннотациями сначала закончите.
Чем плохи аннотации?


Аннотации это хорошо.
Правда когда сделано так:

Код: java
1.
2.
3.
4.
5.
6.
7.
@Component
public class foo {

   @Autowired
   private Bar bar;

}



Писать простые unit-тесты становиться затруднительно.
Нужно либо мокать через Mockito, либо поднимать контекст.

Ну как бы не удобно.

Если делать инжекцию, через конструктор, там свои неудобства, зато unit-тесты проще писать.

ИМХО самый "идеологически правильный" это конфигурация через классы.

Можно конфигурацию и классы с бизнес логикой разнести по разным модулям.
С конфигурацией через аннотации мы привязываемся к Spring'у.

А через классы или xml, можно конфигурацию и бизнес-логику разнести.
Но xml это дно. Поэтому конфигурационные классы. :-)
...
Рейтинг: 0 / 0
09.11.2020, 08:27
    #40016415
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Autowired bean is null
Zzz79
mad_nazgul,
мое имхо -юнит тесты это юзлесс куета для того чтобы списать время разраба и чтобы бизнес платил больше вот и все
никакой смысловой и иной нагрузки они не несут ибо пишутся по существующему коду, и могут свалиться если кто то где то забыл что то поменять при изменениях в коде,что собственно и так мгновенно обнаружится при тестировании
соотвственно я считаю это бесполезной тратой денег
Ну и собственно люди которые считают деньги обходятся без этого искуственного г0вна,а гос корпорации там и так все понятно)
Я работал с начала карьеры на гос банк и там без юнит теста твой код даже смотреть никто не будет,а сейчас в частной конторе- зашел а папку тест там 0))ибо нах оно надо )


"Вы просто не умеете их готовить". ;-)

Вообще приобретать навык написания unit-тестов нужно уже сейчас.
Т.к. с приходом DevOps-практик и прочих аджайлов, всё больше кода будет тестировать приложения.
Т.е. мануального тестирования будет всё меньше и меньше.
И требования к коду будет, чтобы он был тестируемым.

Т.к. любые интеграционные тесты хрупки by default.
То упор таки будет на unit-тесты.
Которые позволяют протестировать хоть что-то, при этом изменения в коде не будут красить все тесты в красное, если не был изменен интерфейс.

И лет через 5-6 код без unit-тестов будет считаться говнокодом.

Так что начать тренироваться надо сейчас.
Чтобы потом на собеседованиях и код-ревью не краснеть.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Autowired bean is null / 25 сообщений из 43, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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