Надстройка Vaadin 7 + Spring + VaadinSpringIntegration — компонент Autowired имеет значение null

Итак, у меня есть приложение Vaadin 7, над которым я работал, но теперь есть необходимость интегрировать JAAS и, в конечном итоге, OpenAM для аутентификации и авторизации. Я заметил, что многие люди используют Spring, чтобы заставить его работать, поэтому я пошел по этому пути. Я использовал надстройку VaadinSpringIntegration и думаю, что она настроена правильно, но когда я запускаю свое приложение, мой автосвязанный компонент имеет значение null. Я никогда раньше не использовал Spring, поэтому вполне возможно, что я что-то упускаю из виду.

Итак, вот часть моего web.xml

<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app
public class HopliteServlet extends SpringVaadinServlet {

/**
 * Attempt to load extra javascript
 * 
 * @throws ServletException
 */
@Override
protected void servletInitialized() throws ServletException {
    super.servletInitialized();
    getService().addSessionInitListener(new SessionInitListener() {

        @Override
        public void sessionInit(SessionInitEvent event) throws ServiceException {
            event.getSession().addBootstrapListener(new BootstrapListener() {

                @Override
                public void modifyBootstrapPage(BootstrapPageResponse response) {

                    response.getDocument().head().appendElement("script").attr("type", "text/javascript").attr("src", "https://www.google.com/jsapi");

                }

                @Override
                public void modifyBootstrapFragment(BootstrapFragmentResponse response) {
                }
            });
        }
    });
}

}
0.xsd"> <display-name>Hoplite Tool</display-name> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>Hoplite</servlet-name> <servlet-class>org.hoplite.servlet.HopliteServlet</servlet-class> <init-param> <param-name>UI</param-name> <param-value>org.hoplite.dashboard.DashboardUI</param-value> </init-param> <init-param> <param-name>widgetset</param-name> <param-value>org.hoplite.dashboard.DashboardWidgetSet</param-value> </init-param> <init-param> <param-name>UIProvider</param-name> <param-value>org.hoplite.dashboard.DashboardUIProvider</param-value> </init-param> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>BAT3</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>

Вот мой applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/lang
 http://www.springframework.org/schema/lang/spring-lang.xsd
 http://www.springframework.org/schema/context 
 http://www.springframework.org/schema/context/spring-context.xsd">

<context:annotation-config />
<context:component-scan base-package="org.hoplite.dashboard" />       

</beans>

Мне пришлось включить некоторый javascript для веб-приложения, поэтому я расширил SpringVaadinServlet.

public class HopliteServlet extends SpringVaadinServlet {

/**
 * Attempt to load extra javascript
 * 
 * @throws ServletException
 */
@Override
protected void servletInitialized() throws ServletException {
    super.servletInitialized();
    getService().addSessionInitListener(new SessionInitListener() {

        @Override
        public void sessionInit(SessionInitEvent event) throws ServiceException {
            event.getSession().addBootstrapListener(new BootstrapListener() {

                @Override
                public void modifyBootstrapPage(BootstrapPageResponse response) {

                    response.getDocument().head().appendElement("script").attr("type", "text/javascript").attr("src", "https://www.google.com/jsapi");

                }

                @Override
                public void modifyBootstrapFragment(BootstrapFragmentResponse response) {
                }
            });
        }
    });
}

}

И, наконец, у меня есть класс пользовательского интерфейса с компонентом Autowired (извините, этот класс длинный, поэтому я могу предоставить только фрагмент)

@Push(PushMode.MANUAL)
@Theme("dashboard")
@Title("Hoplite Tool")
@Component
@Scope("prototype")
public class DashboardUI extends UI {

      @Autowired
      private LoginBean loginBean; 

      ...

      //add listener to button
      signin.addClickListener(new ClickListener() {

        @Override
        public void buttonClick(ClickEvent event) {
           String name = loginBean.performLogin(username.getValue().toString(), password.getValue().toString());
           buildMainView();
        }
}

Вот класс loginBean

@Component
@Scope("prototype")
public class LoginBean {

    @Autowired
    private HttpServletRequest request;

    /**
     * Logs the user in with given username and password.
     * 
     * @param username
     * @param password
     * @return principal name if login is successful
     * @throws ServletException if login fails
     */
    public String performLogin(String username, String password) throws ServletException {

        // If login fails, we throw exception. Otherwise return the principal
        // name of logged in user.
        request.login(username, password);
        return request.getUserPrincipal().getName();
    }

    /**
     * Logs out the current user.
     * 
     * @throws ServletException if logout fails
     */
    public void performLogout() throws ServletException {
        request.logout();
    }
}

Мой класс компонента и класс пользовательского интерфейса находятся в org.hoplite.dashboard.

Однако каждый раз, когда я получаю основной пользовательский интерфейс, тогда loginBean имеет значение null... кто-нибудь может мне помочь?


person 0G0    schedule 21.03.2014    source источник
comment
Не могли бы вы добавить конфигурацию сервлета из web.xml?   -  person Morfic    schedule 21.03.2014
comment
Я добавил конфигурацию сервлета в часть web.xml.   -  person 0G0    schedule 24.03.2014
comment
Какой из com.company.hoplite... в вашем файле web.xml и <context:component-scan base-package="org.hoplite.dashboard" /> в конфигурации spring является опечаткой?   -  person Morfic    schedule 24.03.2014
comment
Извините... Я переименовал пакеты для деловых целей... Имя пакета соответствует коду, поэтому я изменил для org.hoplite.dashboard... извините за путаницу   -  person 0G0    schedule 24.03.2014


Ответы (1)


Я возьму их по 1 за раз:

1) Если не указано иное, SpringVaadinServlet будет использовать ссылку SpringUIProvider для извлечения компонентов из контекста. Если вам абсолютно необходимо перезаписать значение по умолчанию, убедитесь, что DashboardUIProvider извлекает экземпляр пользовательского интерфейса из контекста приложения Spring, чтобы могло произойти «автоматическое волшебство»:

<init-param>
    <param-name>UIProvider</param-name>
    <param-value>org.hoplite.dashboard.DashboardUIProvider</param-value>
</init-param>

2) Если вы отказываетесь от своего DashboardUIProvider, обратите внимание, что SpringUIProvider по умолчанию ожидает параметр beanName вместо UI, поэтому измените:

<init-param>
    <param-name>UI</param-name>
    <param-value>org.hoplite.dashboard.DashboardUI</param-value>
</init-param>

to

<init-param>
    <param-name>beanName</param-name>
    <param-value>dashboardUI</param-value>
</init-param>

где dashboardUI — это неявное имя, которое Spring будет использовать для вашего пользовательского интерфейса. Если вы измените его, обязательно обновите свой web.xml новым.

person Morfic    schedule 24.03.2014
comment
Я пошел дальше и удалил поставщика пользовательского интерфейса, но теперь получаю следующее исключение. javax.servlet.ServletException: com.vaadin.server.ServiceException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.hoplite.dashboard.DashboardUI' is defined com.vaadin.server.VaadinServlet.service(VaadinServlet.java:240) javax.servlet.http.HttpServlet.service(HttpServlet.java:847) Я попытался изменить значение параметра на DashboardUI в файле web.xml и получил ту же ошибку. Должен ли я определять имя в аннотации или где-то еще? - person 0G0; 24.03.2014
comment
Вот и все... У меня все еще есть проблемы с JAAS и возможностью получения пользователей из JBoss, но bean-компоненты подключаются автоматически. Большое спасибо! - person 0G0; 24.03.2014