0

我试图在应用程序启动时从 ServletContext 获取服务器 URL(例如http://www.mywebapp.com/myapp),我通过在启动时调用 bean 方法(使用 @Startup)并获取servlet 上下文,

@Startup
@Name("startupActions")
@Scope(ScopeType.APPLICATION)
public class StartupActionsBean implements StartupActions,
Serializable {

@Logger private Log log;

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Create
@Override
public void create(){
    ServletContext sc = org.jboss.seam.contexts.ServletLifecycle.getServletContext();
    String context = sc.getContextPath();
    String serverInfo = sc.getServerInfo();
    log.debug("__________________START__________________");
    log.debug("Context Path: "+context);
    log.debug("Server Info: "+serverInfo);
}

// Cleanup methods
@Remove
@BypassInterceptors
@Override
public void cleanUp(){}
}

这项工作正常,但是 ServletContext 路径为空白,请参阅下面的控制台输出。

18:52:54,165 DEBUG [uk.co.app.actions.startup.StartupActionsBean] __________________START__________________
18:52:54,165 DEBUG [uk.co.app.actions.startup.StartupActionsBean] Context Path: 
18:52:54,165 DEBUG [uk.co.app.actions.startup.StartupActionsBean] Server Info: JBoss Web/3.0.0-CR1

有谁知道如何通过这个或其他方式获得上下文路径?

附言。使用 SEAM 2.2.2、Jboss AS6 Final、Richfaces 3.3.3

4

2 回答 2

1

不要使用@Startup,您的组件启动代码在上下文完全设置之前被调用,并且其他一些工厂尚未初始化。

观察org.jboss.seam.postInitialization事件并使用它ServletLifecycle.getCurrentServletContext()来获取所需的数据。一个简单的例子:

@Name("contextPath")
public class ContextPathInit implements Serializable {
    private String contextPath;

    @Observer("org.jboss.seam.postInitialization")
    public void init() {
        contextPath = ServletLifecycle.getCurrentServletContext().getContextPath();
    }
}
于 2012-09-24T23:18:19.733 回答
0

您是否尝试过使用getContextName方法从ExternalContext获取它?

FacesContext.getCurrentInstance().getExternalContext().getContextName()
于 2012-09-23T18:25:27.120 回答