当前位置: 首页 > 知识库问答 >
问题:

Vaadin 7 Spring VaadinSpring集成插件-自动生成的bean为空

茹建茗
2023-03-14

所以我有一个Vaadin 7应用程序,我一直在开发,但现在需要集成JAAS和最终的OpenAM进行身份验证和授权。我注意到很多人都在用Spring来让它工作,所以我走了这条路。我使用了VaadinSpringIntegration插件,我认为它的设置是正确的,但当我启动我的应用程序时,我的自动连线bean是空的。我以前从未使用过Spring,所以很可能我忽略了一些东西。

这是我网站的一部分。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_3_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>

这是我的应用程序上下文。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>

我必须为webapp添加一些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) {
                }
            });
        }
    });
}

}

最后,我的UI类有一个自动连接的bean(抱歉,这个类太长了,所以我只能提供一个片段)

@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();
    }
}

我的bean类和UI类在org中。霍普利特。仪表板

然而,每次我得到主用户界面,然后登录豆是空的...有人能帮我吗?

共有1个答案

陆俊智
2023-03-14

我一次拿一个:

1) 除非另有规定,SpringVaadinServlet将使用SpringUIProvider从上下文中检索bean。如果您确实需要覆盖默认的UI实例,请确保DashboardUIProvider正在从spring应用程序上下文检索UI实例,以便实现“自动魔法”:

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

2) 如果放弃DashboardUI提供程序,请注意默认SpringUI提供程序需要一个beanNameparam,而不是UI,因此请更改:

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

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

其中,dashboardUI是spring将用于您的UI的隐式名称。如果你改变了它,一定要更新你的网站。xml与新的

 类似资料:
  • 我有一个Bean,负责从配置文件加载项目设置,并使它们可用于任何其他可能需要它们的对象: 现在,我有一组组件类,它们通过多个步骤扩展了一个抽象类,我想在其中使用这个bean: 根据我的理解,这应该是有效的,因为@autowmed字段受到保护,因此可以从@Component类中看到。然而,相反,我得到了这个例外: ...其中引用的

  • cmf_plugin_url($url, $param = [], $domain = false) 功能 生成访问插件的url 参数 $url: string url格式:插件名://控制器名/方法 $param: array 参数 $domain:boolean|array 是否显示域名 或者直接传入域名 返回 string 插件的url 例子 echo cmf_plugin_url('De

  • X1.4.0新增 sp_plugin_url($url,$param,$domain) 功能: 生成访问插件的url 参数: $url: url 格式:插件名://控制器名/方法 $param:额外参数,默认为空数组 $domain:是否添加域名,默认false 返回: 类型url 模板使用: {:sp_plugin_url('Demo://Index/index',array('id'=>2)

  • cmf_plugin_url($url, $param = [], $domain = false) 功能 生成访问插件的url 参数 $url: string url格式:插件名://控制器名/方法 $param: array 参数 $domain:boolean|array 是否显示域名 或者直接传入域名 返回 string 插件的url 例子 echo cmf_plugin_url('De

  • 我有两个表A(id,col1,col2)和B(col3,col4,col5,col6) 这引发错误 为什么postgres不自动为列“id”生成值?如果我从表B中提供“id”,或者如果我插入单行(没有select)并为自动生成的列提供“default”关键字,查询就可以工作。 编辑:表创建查询

  • 问题内容: 有人知道如何从1开始生成,以便下一个对象具有2,依此类推吗? 我尝试了以下方法,但不起作用: 问题答案: 您需要一个 静态的 类成员来跟踪上次使用的索引。确保还实现一个复制构造函数: 更新: 正如@JordanWhite建议的那样,您可能希望使static计数器成为 atomic ,这意味着可以安全地同时使用(即一次在多个线程中使用)。为此,将类型更改为: 增量读取和复位操作变为: