Внедрение зависимостей Struts2

В настоящее время я создаю веб-приложение, используя Struts2 с плагином Struts2-spring.

вот фрагмент моего applicationContext.xml

<bean id="sessionFactory" scope="singleton"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    </bean>
    <!-- Springs Hibernate Transaction Manager -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <tx:annotation-driven />
    <!-- Create DAO Objects -->
    <bean id = "userDao" class = "org.hitplay.users.dao.UserDao" scope = "singleton">
        <property name ="sessionFactory" ref = "sessionFactory" />
    </bean>
    <bean id = "adminDao" class = "org.hitplay.admin.dao.AdminDao" scope = "singleton">
        <property name ="sessionFactory" ref = "sessionFactory" />
    </bean>
    <bean id="authenticateLoginService" class="org.hitplay.services.AuthenticateLoginService" scope="singleton">
        <property name="userDao" ref="userDao" />
        <property name="adminDao" ref="adminDao" />
    </bean>

    <bean id="accountAuthenticationManager" class="org.hitplay.authentication.manager.AccountAuthenticationManager" scope="singleton">
        <property name="authenticateLoginService" ref="authenticateLoginService" />
    </bean>

Вот мой класс AccountAuthenticationManager

@Transactional
public class AccountAuthenticationManager  implements AuthenticationManager {

 protected static Logger logger = Logger.getLogger("service");

 // Our custom DAO layer
 private AuthenticateLoginService authenticateLoginService;

 public AuthenticateLoginService getAuthenticateLoginService() {
    return authenticateLoginService;
}

public void setAuthenticateLoginService(
        AuthenticateLoginService authenticateLoginService) {
    this.authenticateLoginService = authenticateLoginService;
}

public Authentication authenticate(Authentication auth) throws AuthenticationException {

  System.out.println(authenticateLoginService);
 //Some more codes here
}

Как вы можете видеть на нашем отображении, мы внедряем authenticateLoginService внутрь класса AccountAuthenticationManager. мы даже предоставили сеттеры и геттеры для authenticateLoginService, но, как вы видите, когда мы запускаем
метод authenticate(Authentication auth), authenticationLoginService возвращает null, мы понятия не имеем, почему это происходит. обратите внимание, что AccountAuthenticationManager не является действием Struts.

в настоящее время мы используем плагин struts2-spring и Spring Security.


person user962206    schedule 02.02.2013    source источник
comment
я думаю, нам нужно использовать ‹bean name=authenticateLoginService................../›   -  person PSR    schedule 02.02.2013
comment
как получить ссылку на AccountAuthenticationManager? вы получаете экземпляр AccountAuthenticationManager через Spring Injection? или вы просто используете новый ключ для его создания? Я не вижу никаких проблем в вашем файле конфигурации, и Spring предупредит вас во время запуска, если ему не удалось найти/внедрить зависимость. Поскольку вы не упомянули об исключении, созданном Spring, я хотел бы знать, как вы получаете экземпляр AccountAuthenticationManager.   -  person spiritwalker    schedule 02.02.2013
comment
@spiritwalker Я позволил создать Spring AccountAuthenticationManager с помощью самой Spring инъекции. Я использую spring-security с этим. но   -  person user962206    schedule 02.02.2013
comment
Вы сталкиваетесь с проблемой только с authenticationLoginService или с другими объектами?   -  person PSR    schedule 02.02.2013
comment
только с аутентификателогинсервис   -  person user962206    schedule 02.02.2013
comment
проверьте, внедрив другие классы в AccountAuthenticationManager. Только для тестирования   -  person PSR    schedule 02.02.2013
comment
он внедряет другие объекты, он даже внедряет аутентификациюLoginService при запуске, но когда мы запускаем аутентификацию, он становится нулевым   -  person user962206    schedule 02.02.2013
comment
как вы можете сказать, что он внедряет аутентификациюЛогинСервис при запуске   -  person PSR    schedule 02.02.2013
comment
поскольку это одноэлементный компонент, Spring будет создавать экземпляры всех одноэлементных компонентов во время запуска по умолчанию, если вы явно не укажете ленивую инъекцию.   -  person spiritwalker    schedule 02.02.2013
comment
@sambapenugonda, потому что я добавил system.out.println(МОЕ СООБЩЕНИЕ ЗДЕСЬ) в установщик aunthenticateLoginService. и я вижу это сообщение при запуске.   -  person user962206    schedule 02.02.2013
comment
Я полагаю, что вы добавили код отладки в свой AccountAuthenticationManager, например, print this.hashCode(); просто убедитесь, что это тот же экземпляр, когда он вводит другие объекты и возвращает null   -  person spiritwalker    schedule 02.02.2013
comment
@spiritwalker, как указать ленивую инъекцию?   -  person user962206    schedule 02.02.2013
comment
@user962206 user962206, да, как я уже сказал, spring будет жаловаться, если ему не удалось внедрить зависимость. Так что маловероятно, что в опубликованной вами конфигурации Spring что-то не так. Меня немного беспокоит, когда вызывается authentication(), это тот же экземпляр, что и созданный Spring.   -  person spiritwalker    schedule 02.02.2013
comment
@user962206 user962206 вы можете заставить Spring лениво создавать экземпляр одноэлементного компонента. static.springsource.org/spring/docs/3.0.x/   -  person spiritwalker    schedule 02.02.2013
comment
@spiritwalker В настоящее время я работаю в службе безопасности, я уже проверил то, что вы предложили, оказалось, что они оба разные экземпляры. они оба разные хэш-код   -  person user962206    schedule 02.02.2013


Ответы (1)


StackOverflow не любит длинный список комментариев, поэтому я продолжу здесь. Итак, в вашей системе есть два разных экземпляра AccountAuthenticationManager. Допустим, тот, который создан Spring во время запуска, называется instanceA, а неизвестный — instanceB. Если instanceB не создан контейнером Spring, то instanceB никак не может разрешить его зависимость (AuthenticateLoginService). Если вы можете отладить систему, вы можете заглянуть в дамп потока и выяснить, когда и где был создан instanceB и кем создан?

person spiritwalker    schedule 02.02.2013
comment
как посмотреть дамп потока? а кто кого создал? используя затмение - person user962206; 02.02.2013
comment
если вы можете отлаживать свою систему, когда она останавливается в точке останова, вы увидите трассировку потока в консоли отладки. вам нужно выяснить, кто (какой класс) создал instanceB - person spiritwalker; 02.02.2013