【问题标题】:Jboss Seam: Enabling Debug page on WebLogic 10.3.2 (11g)Jboss Seam:在 WebLogic 10.3.2 (11g) 上启用调试页面
【发布时间】:2011-01-28 01:35:12
【问题描述】:

跳到更新 3

我想在 Weblogic 10.3.2 (11g) 上启用 Seam 调试页面。所以,我做了以下事情:

我在我的 ejb 和 web maven 项目(都是我的超级项目的模块)中都有 jboss-seam 和 jboss-seam-debug jar 作为依赖项我把这个上下文参数放在我的 web.xml 中:

<context-param>
        <param-name>org.jboss.seam.core.init.debug</param-name>
        <param-value>true</param-value>
</context-param>

现在,当我点击我的应用程序的 URL 时,我得到了带有此异常的调试页面(帖子末尾的完整堆栈跟踪):

由 java.lang.IllegalStateException 与 消息:“没有阶段 id 绑定到当前 线程(确保你没有两个 SeamPhaseListener 实例 已安装)”

从我读到的帖子看来,这似乎与类路径中的两个 jboss-seam 或 jboss-seam-debug 罐有关。我打开了我的 ear 文件,每个文件中只有一个存在(在 ear 中),而 war 本身在 WEB-INF/lib 中没有库。

我还阅读了另一种使用 components.xml 初始化调试页面的方法。我还尝试在 WEB-INF 中包含以下 components.xml,但它也不起作用:

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
        xmlns:core="http://jboss.com/products/seam/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
        http://jboss.com/products/seam/core
        http://jboss.com/products/seam/core-2.2.xsd
        http://jboss.com/products/seam/components
        http://jboss.com/products/seam/components-2.2.xsd">
        <core:init debug="true"/>
</components>

关于如何正确启用调试页面的任何建议?

干杯!

完整的堆栈跟踪:

org.jboss.seam.contexts.PageContext.getPhaseId(PageContext.java:163)
org.jboss.seam.contexts.PageContext.isBeforeInvokeApplicationPhase(PageContext.java:175)
org.jboss.seam.contexts.PageContext.getCurrentWritableMap(PageContext.java:91)
org.jboss.seam.contexts.PageContext.remove(PageContext.java:105)
org.jboss.seam.Component.newInstance(Component.java:2141)
org.jboss.seam.Component.getInstance(Component.java:2021)
org.jboss.seam.Component.getInstance(Component.java:2000)
org.jboss.seam.Component.getInstance(Component.java:1994)
org.jboss.seam.Component.getInstance(Component.java:1967)
org.jboss.seam.Component.getInstance(Component.java:1962)
org.jboss.seam.faces.FacesPage.instance(FacesPage.java:92)
org.jboss.seam.core.ConversationPropagation.restorePageContextConversationId(ConversationPropagation.java:84)
org.jboss.seam.core.ConversationPropagation.restoreConversationId(ConversationPropagation.java:57)
org.jboss.seam.jsf.SeamPhaseListener.afterRestoreView(SeamPhaseListener.java:391)
org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:230)
org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:196)
com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:104)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3592)
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2202)
weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2108)
weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1432)
weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

更新 1:

现在调试页面根本没有出现。当我要求http://localhost/myapp/debug.xhtml 时,我得到一个页面:

myapp/debug.xhtml

与任何不存在的页面相同。我打开了 .ear,下面的 jboss jar 在:

  • jboss-seam-debug-2.2.0.GA.jar
  • jboss-el-1.0_02.CR4.jar
  • jboss-seam-2.2.0.GA.jar

我目前的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_2_5.xsd"
version="2.5">
<display-name>PRS 6.0</display-name>

<session-config>
    <session-timeout>30</session-timeout>
</session-config>
<!--
    The default behavior of JSF is to map the incoming request for a JSF
    view identifier (view ID for short) to a JSP file with the file
    extension .jsp. To get JSF to look for a Facelets template instead, we
    must register the .xhtml extension as the default suffix for JSF views
-->
<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>
        /WEB-INF/faces-config/application.xml
    </param-value>
</context-param>

<context-param>
    <param-name>facelets.REFRESH_PERIOD</param-name>
    <param-value>2</param-value>
</context-param>
<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>facelets.SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
</context-param>

<context-param>
    <param-name>com.sun.faces.verifyObjects</param-name>
    <param-value>false</param-value>
</context-param>

<context-param>
    <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
    <param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
<context-param>
    <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>org.ajax4jsf.COMPRESS_STYLE</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
    <param-value>NONE</param-value>
</context-param>
<context-param>
    <param-name>org.richfaces.SKIN</param-name>
    <param-value>blueSky</param-value>
</context-param>
<context-param>
    <param-name>org.richfaces.CONTROL_SKINNING</param-name>
    <param-value>enable</param-value>
</context-param>
<context-param>
    <param-name>org.richfaces.LoadStyleStrategy</param-name>
    <param-value>ALL</param-value>
</context-param>
<context-param>
    <param-name>org.richfaces.LoadScriptStrategy</param-name>
    <param-value>ALL</param-value>
</context-param>


<!-- Seam Filter -->
<!-- (MUST BE FIRST)-->
<filter>
    <filter-name>Seam Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Seam Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- RichFaces filter -->
<filter>
    <display-name>RichFaces Filter</display-name>
    <filter-name>richfaces</filter-name>
    <filter-class>org.ajax4jsf.Filter</filter-class>
    <init-param>
        <description>Set the size limit for uploaded files as attachments in bytes. (max 5MB)</description>
        <param-name>maxRequestSize</param-name>
        <param-value>5242880</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>richfaces</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

<listener>
    <listener-class>
        XX.XXXX.XXX.prs.web.listeners.ResourceInitializationListener</listener-class>
</listener>

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

<listener>
    <listener-class>XX.XXXX.XXX.prs.web.listeners.EJBInjectionListener</listener-class>
</listener>
<!-- Seam Listener-->
<listener>
    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
</listener>

<!-- Faces Servlet -->
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

--> Seam 资源 Servlet--> org.jboss.seam.servlet.SeamResourceServlet--> --> --> Seam 资源 Servlet--> /seam/resource/*--> -->

<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

</web-app>

faces.config

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-facesconfig_1_2.xsd"
version="1.2">

<application>
    <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>en</supported-locale>
    </locale-config>
    <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
    <el-resolver>org.jboss.seam.el.SeamELResolver</el-resolver>
    <resource-bundle>
        <base-name>XX.XXXX.XXX.prs.web.messages.messages</base-name>
        <var>msgs</var>
    </resource-bundle>
    <resource-bundle>
        <base-name>XX.XXXX.XXX.prs.web.messages.validation</base-name>
        <var>val</var>
    </resource-bundle>
</application>

<lifecycle>
    <phase-listener>XX.XXXX.XXX.prs.web.listeners.SetFocusListener</phase-listener>
</lifecycle>
<!--    <lifecycle>-->
<!--
    <phase-listener>XX.XXXX.XXX.prs.web.listeners.DebugPhaseListener</phase-listener>
-->

<converter>
    <converter-for-class>XX.XXXX.XXX.prs.model.Applicant</converter-for-class>
    <converter-class>
        XX.XXXX.XXX.prs.web.common.converters.ApplicantConverter</converter-class>
</converter>

<validator>
    <validator-id>EmailValidator</validator-id>
    <validator-class>XX.XXXX.XXX.prs.web.common.validators.EmailValidator</validator-class>
</validator>


</faces-config>

components.xml

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:core="http://jboss.com/products/seam/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://jboss.com/products/seam/core
    http://jboss.com/products/seam/core-2.2.xsd
    http://jboss.com/products/seam/components
    http://jboss.com/products/seam/components-2.2.xsd">

<core:init debug="true" />

<core:manager concurrent-request-timeout="500"
    conversation-timeout="1200000" conversation-id-parameter="cid"
    parent-conversation-id-parameter="pid" />

更新 2:

here 这些家伙也有同样的问题。他们有一个包含内部 WAR 项目的外部 EAR 项目。他们讨论这可能与 jars 在项目中的最终结果有关。

我使用 Maven,并且我已将其设置为创建“Skinny Wars”,即从内部 WAR 项目中排除所有 jar 依赖项,以便它保持较小的大小。它的所有依赖项都包含在 EAR 中,并被所有其他模块使用。

我更改了 maven-war-plugin 的设置,将特定于 web 的 jars(链接中提到的那些,如 RichFaces、jboss-seam-debug、Facelets 等)留在 war 中。

但是,问题已恢复到以前的形式。我现在得到调试页面,无论我按什么链接,但最初的例外情况。

由 java.lang.IllegalStateException 引起,带有消息:“没有阶段 id 绑定到当前线程(确保您没有安装两个 SeamPhaseListener 实例)”

更新 3: 应用.ear的结构如下:

application.ear
|--> APP-INF
| |--> classes
|--> lib (all jar dependencies go here, including the WAR dependencies, EJB module dependencies)
|-->META_INF
| |--> application.xml
| |--> data-sources.xml
| |--> MANIFEST.MF
| |--> weblogic.xml
| |--> weblogic-application.xml
|--> jboss-seam-2.2.0.GA.jar
|--> myEjbModule1.jar
|--> myEjbModule2.jar
|--> myEjbModule3.jar
|--> myEjbModule4.jar
|--> myWar.war (NO libraries in WEB-INF/lib, finds everything in EAR/lib)

在没有启用调试的情况下部署 .ear 应用程序时(不包括 ear 中的 jboss-seam-debug.jar),应用程序被正确加载。

在 EAR(EAR/lib 目录)中部署 WITH jboss-seam-debug.jar 时,应用程序不出现,而只出现调试页面,异常如下(最后是堆栈跟踪):

请求处理期间的异常:

由 java.lang.IllegalStateException 与 消息:“没有阶段 id 绑定到当前 线程(确保你没有两个 SeamPhaseListener 实例 已安装)”

当“JBoss-izing”同一个 EAR(删除 JBoss 提供的休眠 jar,并将所有库从 EAR/lib 移动到 EAR 根目录)时,应用程序正确加载。应用程序和调试页面都正确显示。

完整的堆栈跟踪:

org.jboss.seam.contexts.PageContext.getPhaseId(PageContext.java:163) org.jboss.seam.contexts.PageContext.isBeforeInvokeApplicationPhase(PageContext.java:175) org.jboss.seam.contexts.PageContext.getCurrentWritableMap(PageContext.java:91) org.jboss.seam.contexts.PageContext.remove(PageContext.java:105) org.jboss.seam.Component.newInstance(Component.java:2141) org.jboss.seam.Component.getInstance(Component.java:2021) org.jboss.seam.Component.getInstance(Component.java:2000) org.jboss.seam.Component.getInstance(Component.java:1994) org.jboss.seam.Component.getInstance(Component.java:1967) org.jboss.seam.Component.getInstance(Component.java:1962) org.jboss.seam.faces.FacesPage.instance(FacesPage.java:92) org.jboss.seam.core.ConversationPropagation.restorePageContextConversationId(ConversationPropagation.java:84) org.jboss.seam.core.ConversationPropagation.restoreConversationId(ConversationPropagation.java:57) org.jboss.seam.jsf.SeamPhaseListener.afterRestoreView(SeamPhaseListener.java:391) org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:230) org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:196) com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114) com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:104) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292) weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:530) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3592) weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2202) weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2108) weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1432) weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

【问题讨论】:

  • @Markos Fragkakis 您的 StackTrace 与您的调试页面无关。它的发生是因为它抱怨:No phase id bound to current thread (确保你没有安装两个 SeamPhaseListener 实例) 所以使用 WINRAR 提取所有的 ear 应用程序,并确保你的 war 文件WEB-INF/lib 文件夹和你的 ejb jar 文件 lib 文件夹不包含 jboss-seam.jar 它必须放在你的ear文件的根文件夹中并在ear中声明META-INF/application.xml 文件
  • @Arthur Ronald F D Garcia,这个问题毕竟可能与 Weblogic 有关。经过这些天,我已经改变了耳朵的结构。它在其根目录中包含所有 EJB(包括 Seam)。我的 .war 只包含它自己的库(Richfaces、Facelets、Seam UI、Seam Debug)。我在 JBoss 4.2.3.GA 上尝试了 .ear(在删除了 JBoss 中包含的 Hibernate 之后)并且它起作用了。
  • @Markos Fragkakis Bingo!问题是因为Weblogic。如前所述:Weblogic 服务器存在一些需要解决的已知问题,以及特定于 Weblogic 所需的配置更改。 仔细阅读 docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/… 参见该页面 Weblogic EJB 支持的特殊 jboss-seam.jar
  • @Arthur Ronald F D Garcia,请检查上次更新(更新 3 !!)我已经使用了 Weblogic 特定的 Seam,并且已经完成了您提供的链接中提到的所有必要更改。我开始怀疑 Weblogic 和调试页面存在错误。
  • @Markos Fragkakis 附加链接:download.oracle.com/docs/cd/E12840_01/wls/docs103/programming/… 和 download.oracle.com/docs/cd/E12840_01/wls/docs103/webapp/… 除此之外,我认为 APP-INF 和 APP-INF/classes 都不是目录JEE规范标准化所以,牢记在心

标签: java seam


【解决方案1】:

你得到以下异常

没有绑定到当前线程的阶段 ID(确保您没有安装两个 SeamPhaseListener 实例)

但是你说你已经安装了一个 ejb 和 web maven 项目。当您部署应用程序时,可能两者都包含一个 SeamPhaseListener。或许,它可以解释为什么会出现异常(安装了两个 SeamPhaseListener 实例)。

我的建议是(如果你想避免很多头痛)

始终使用 Seam-gem 生成您的项目

见here为什么

一篇不错的文章,除了《Seam in Action》这本书,关于 JSF/Seam 的文章可以在here找到。

添加到原始答案

看看 Seam in Action 这本书是怎么说的

在 Seam 2.0 中,Seam 阶段侦听器在 facesconfig.xml 描述符中声明,该描述符包含在核心 Seam JAR 文件 jboss-seam.jar 中。因此,阶段侦听器在您将此 JAR 文件包含在应用程序中后立即可用。

因此,您不必担心 SeamPhaseListener。接缝会。

更新

首先,您有一个耳朵应用程序。在继续之前

1º每个 EJB 和 war 模块应该在 application.xml(描述你耳朵的文件)中声明

所以您的耳朵应用程序应该看起来像这个(我们称您的耳朵应用程序为 pureCharger)

pureCharger.ear

    META-INF
        application.xml
    pureCharger-ejb.jar
        META-INF
            ejb-jar.xml
            persistence.xml
        lib
            // libraries ONLY USED by your EJB module goes here
    pureCharger-war.war
        WEB-INF
            web.xml
            components.xml
            faces-config.xml
            pages.xml
        lib
            // Here is what you want
            jboss-seam-debug.jar 
            jboss-seam-ui.jar
            jsf-facelets.jar
            // other libraries ONLY USED by your war module goes here
    jboss-seam.jar
    lib
        // JBoss Expression Language is used by both EJB and war module
        jboss-el.jar
        // libraries SHARED by all of your modules goes here

ejb-jar.xml 如下所示(它通过你的 EJB 组件启用@In-jection)

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar 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/ejb-jar_3_0.xsd" version="3.0">
    <interceptors>
        <interceptor>
            <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
        </interceptor>
    </interceptors>
    <assembly-descriptor>
        <interceptor-binding>
            <ejb-name>*</ejb-name>
            <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
        </interceptor-binding>
    </assembly-descriptor>
</ejb-jar>

2º jboss-seam.jar 是一个 EJB 模块

所以也应该在application.xml文件中声明。而且,如上所述,您不必定义SeamPhaseListener,因为jboss-seam.jar 包含SeamPhaseListener。所以避免看到这个好消息

安装了两个 SeamPhaseListener 实例

所以你的耳朵 application.xml 应该看起来像这个

<?xml version="1.0" encoding="UTF-8"?>
<application version="5" 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/application_5.xsd">
    <display-name>pureCharger</display-name>
    <module>
        <ejb>pureCharger-ejb.jar</ejb>
    </module>
    <module>
        <ejb>jboss-seam.jar</ejb>
    </module>
    <module>
        <web>
            <web-uri>pureCharger-war.war</web-uri>
            <context-root>pureCharger</context-root>
        </web>
    </module>
</application>

好的。走吧

3º您要启用调试页面

Seam 调试页面将可用如果此 jar 与 Facelets 一起部署在 WEB-INF/lib 中,并且如果您设置了 init 组件的调试属性

所以你的 components.xml 应该看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
    xmlns:core="http://jboss.com/products/seam/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://jboss.com/products/seam/core
    http://jboss.com/products/seam/core-2.2.xsd
    http://jboss.com/products/seam/components
    http://jboss.com/products/seam/components-2.2.xsd">
    <core:init jndi-pattern="pureCharger/#{ejbName}/local" debug="true"/>
    <core:manager concurrent-request-timeout="500" conversation-timeout="120000" conversation-id-parameter="cid" />
</components>

如上所示我已经定义了全局JNDI地址(我想你正在使用JBoss并且你的ear应用程序被称为pureCharger)以便Seam检索它的EJB组件

最后,我们的 web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
    <context-param>
        <param-name>facelets.DEVELOPMENT</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <!--It must be the first-->
    <filter>
        <filter-name>Seam Filter</filter-name>
        <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Seam Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--It must be the first-->
    <listener>
        <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <!--specified in minutes-->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
</web-app>

还有我们的 faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-facesconfig_1_2.xsd" version="1.2">
<application>
    <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>en</supported-locale>
    </locale-config>
    <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
    <resource-bundle>
        <base-name>XX.XXXX.XXX.prs.web.messages.messages</base-name>
        <var>msgs</var>
    </resource-bundle>
    <resource-bundle>
        <base-name>XX.XXXX.XXX.prs.web.messages.validation</base-name>
        <var>val</var>
    </resource-bundle>
</application>
</faces-config>

一些注意事项

您不需要在 faces-config.xml 中声明 org.jboss.seam.el.SeamELResolver,因为它与 jboss-seam.jar 捆绑在一起。

现在,错过了什么?

我们需要调用我们的调试页面(不要忘记启动 JBoss 并部署您的 ear 应用程序)

http://127.0.0.1:8080/pureCharger/debug.xhtml

再来一次

如果你真的想避免很多头痛,请使用 seam-gem

更新

你的耳朵项目如上所示 ??? 确保您的战争库文件夹不包含任何 jboss-seam.jar 文件。你说

我打开了 .ear,下面的 jboss jars 在里面:

  • jboss-seam-debug-2.2.0.GA.jar(错误)必须放在war文件WEB-INF/lib文件夹中
  • jboss-el-1.0_02.CR4.jar(错误)必须放在ear文件lib文件夹中
  • jboss-seam-2.2.0.GA.jar(右)但必须在ear META-INF/application.xml文件中声明

Here你可以看到我提供的关于 EJB 2.0 和 3.0 的不错的教程

关于 Seam Maven 集成的有用链接

http://www.seamframework.org/Community/MavenWithSeam

http://www.seamframework.org/Documentation/SeamWithMavenOverview

http://www.seamframework.org/Community/SeamInActionChapter2345And6Mavenized

http://www.seamframework.org/Community/MavenSeamArchetype

问候,

【讨论】:

  • 很抱歉,但我不明白我是如何“安装”两个 SeamPhaseListener。在我看来,当您在 web.xml 文件中输入适当的条目时,就会安装 SeamPhaseListener,我拥有该文件。第二个实例安装在哪里?
  • 如果你暗示我有两个项目的事实是相关的,我打开了最终的 .ear 并且只有一个 jboss-seam-debug.jar 最终在其中。这是在 jboss-seam-debug.jar 的存在自动注册一个 SeamPhaseListener 的情况下。
  • 请再看一遍,更新当前配置和状态。
  • @Arthur ...对不起,这也不起作用...我仍然遇到同样的异常。我还通过排除 Maven 依赖项尝试了解决方案的变体,但没有运气。由于某种原因,SeamPhaseListener 仍然“注册”了两次。
  • 无论如何,感谢您解决所有这些麻烦。我仍然不会将此答案标记为 the 正确,但会支持您在其他帖子中所做的其他 cmets。干杯!
【解决方案2】:

Seam 没有出现调试页面的原因令人难以置信(对我来说)。

我使用 Apache Maven 打包了我的应用程序。传统上,由 maven 管理的 jar 文件的文件名也包含版本号。 Seam 的 jar 是 jboss-seam -2.2.0.GA.jar。因为Seam 是应用程序中的一个EJB 模块,所以我声明了它的依赖关系。事实上,EAR 将它作为一个 EJB 模块(位于 EAR 的根目录)包含在内,并且还在 META-INF/application.xml 中声明了它。

我不知道规范是否定义了 EAR 中 EJB 模块的命名限制,但文件名的版本部分是 WebLogic 不喜欢的(如果修改,战争在 JBoss 上运行良好)。

我从这里更改了 maven-ear-plugin 中的设置:

<ejbModule>
    <groupId>org.jboss.seam</groupId>
    <artifactId>jboss-seam</artifactId>
</ejbModule>

到这里:

<ejbModule>
    <groupId>org.jboss.seam</groupId>
    <artifactId>jboss-seam</artifactId>
    <bundleFileName>jboss-seam.jar</bundleFileName>
</ejbModule>

现在我可以看到我的应用程序和调试页面。

【讨论】:

  • @Markos Fragkakis 恭喜(+1)。现在,您可以明白我为什么说:如果您想避免很多头痛,请使用 Seam-gem。除此之外,Seam 捆绑示例可以让您深入了解 Seam。不要忘记在两天后将您自己的答案标记为已接受。
【解决方案3】:

调试页面是什么意思? 你的意思是默认的Seam调试页面吗?哪个是 debug.seam?通常http://localhost:8080/debug.seam ?

只放入web.xml 是不够的。您还需要放入 components.xml

<core:init debug="true" jndi-pattern="myApp/#{ejbName}/local"/>

您还需要确保 jboss-seam-debug.jar 在类路径中。 Seam 的拦截器应该会自动拾取它。

如果您使用 Facelets,要获取其调试页面,您需要将其放入 web.xml

<context-param>
  <param-name>facelets.DEVELOPMENT</param-name>
  <param-value>true</param-value>
</context-param>

来自 Arthur 的关于始终使用 seam-gen 生成项目的提示是一个非常好的主意。

我还看到 Arthur 说你需要确保 jboss-seam-debug.jar 在你的战争中不应该在你的库中。这不一定是正确的。 我有我的

myapp.war/WEB-INF/lib/jboss-seam-debug.jar

【讨论】:

  • @Shervin 不,不。我说jboss-seam-debug.jar 必须放在war 文件WEB-INF lib 文件夹中。如你所见
  • @Arthur Ronald F D Garcia 啊,好吧。对不起,那是我的错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
相关资源
最近更新 更多