Jboss Seam:在WebLogic 10.3.2上启用调试页面(11g)
跳过更新3
我想在Weblogic 10.3.2(11g)上启用Seam调试页面。 所以,我做了以下事情:
我在我的ejb和web maven项目中都有jboss-seam和jboss-seam-debug jar作为依赖项(两者都是我的超级项目的模块)我把这个上下文参数放在我的web.xml中:
org.jboss.seam.core.init.debug true
现在,当我点击我的应用程序的URL时,我得到了具有此exception的调试页面(post末尾的完整堆栈跟踪):
由java.lang.IllegalStateException引起的消息:“没有相位id绑定到当前线程(确保没有安装两个SeamPhaseListener实例)”
从我阅读的post看来,这似乎与两个jboss-seam或jboss-seam-debug在类路径中相关。 我打开了我的耳朵文件,只有一个存在(在耳中),而战争本身在WEB-INF / lib中没有库。
我还读到了使用components.xml初始化调试页面的另一种方法。 我还尝试在WEB-INF中包含以下components.xml,但它也不起作用:
有关如何正确启用调试页面的任何建议?
干杯!
完整堆栈跟踪:
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,下面的jbossjar子在:
- JBoss的接缝调试,2.2.0.GA.jar
- 的jboss-EL-1.0_02.CR4.jar
- JBoss的接缝-2.2.0.GA.jar
我目前的配置:
PRS 6.0 30 javax.faces.DEFAULT_SUFFIX .xhtml javax.faces.STATE_SAVING_METHOD server javax.faces.CONFIG_FILES /WEB-INF/faces-config/application.xml facelets.REFRESH_PERIOD 2 facelets.DEVELOPMENT true facelets.SKIP_COMMENTS true com.sun.faces.verifyObjects false org.ajax4jsf.VIEW_HANDLERS com.sun.facelets.FaceletViewHandler org.ajax4jsf.COMPRESS_SCRIPT true org.ajax4jsf.COMPRESS_STYLE true org.ajax4jsf.xmlparser.ORDER NONE org.richfaces.SKIN blueSky org.richfaces.CONTROL_SKINNING enable org.richfaces.LoadStyleStrategy ALL org.richfaces.LoadScriptStrategy ALL Seam Filter org.jboss.seam.servlet.SeamFilter Seam Filter /* RichFaces Filter richfaces org.ajax4jsf.Filter Set the size limit for uploaded files as attachments in bytes. (max 5MB) maxRequestSize 5242880 richfaces Faces Servlet REQUEST FORWARD INCLUDE XX.XXXX.XXX.prs.web.listeners.ResourceInitializationListener com.sun.faces.config.ConfigureListener XX.XXXX.XXX.prs.web.listeners.EJBInjectionListener org.jboss.seam.servlet.SeamListener Faces Servlet javax.faces.webapp.FacesServlet 1 Faces Servlet *.xhtml
– > Seam Resource Servlet – > org.jboss.seam.servlet.SeamResourceServlet – > – > – > Seam Resource Servlet – > / seam / resource / * – > – >
index.xhtml
faces.config
en en com.sun.facelets.FaceletViewHandler org.jboss.seam.el.SeamELResolver XX.XXXX.XXX.prs.web.messages.messages msgs XX.XXXX.XXX.prs.web.messages.validation val XX.XXXX.XXX.prs.web.listeners.SetFocusListener <!-- --> <!-- XX.XXXX.XXX.prs.web.listeners.DebugPhaseListener --> XX.XXXX.XXX.prs.model.Applicant XX.XXXX.XXX.prs.web.common.converters.ApplicantConverter EmailValidator XX.XXXX.XXX.prs.web.common.validators.EmailValidator
components.xml中
更新2:
这些人在这里有同样的问题。 它们有一个包含内部WAR项目的外部EAR项目。 他们讨论这可能与jar子在项目中的结果有关。
我使用Maven,并设置它来创建“Skinny Wars”,它排除了内部WAR项目中的所有jar依赖项,因此它的大小仍然很小。 其所有依赖项都包含在EAR中,并由所有其他模块使用。
我更改了maven-war-plugin的设置,以便在战争中留下特定于网络的jar(链接中提到的jar,如RichFaces,jboss-seam-debug,Facelets等)。
但是,问题已恢复到以前的forms。 我现在得到调试页面,无论我按哪个链接,都有初始exception。
由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应用程序时(不包括耳中的jboss-seam-debug.jar),正确加载应用程序。
在EAR(EAR / lib目录)中部署WITH jboss-seam-debug.jar时,应用程序不会出现,但只有调试页面出现以下exception(最后是stacktrace):
请求处理期间的exception:
由java.lang.IllegalStateException引起的消息:“没有相位id绑定到当前线程(确保没有安装两个SeamPhaseListener实例)”
当“JBoss-izing”相同的EAR(删除由JBoss提供的hibernate 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(阶段。 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.doFilte r(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.Ajax4js fFilter.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.in ternal.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)
您会收到以下exception
没有阶段id绑定到当前线程(确保没有安装两个SeamPhaseListener实例)
但是你说你已经安装了一个ejb和web maven项目。 在部署应用程序时,可能两者都包含SeamPhaseListener。 它可能解释了为什么你得到你的exception(安装了两个SeamPhaseListener实例)。
我的建议是(如果你想避免很多头痛)
始终使用Seam-gem生成项目
看到这里的原因
除了Seam in Action书之外,关于JSF / Seam的一篇很好的文章可以在这里找到
添加到原始答案
看看Seam in Action书中谈到了什么
在Seam 2.0中,Seam阶段侦听器在facesconfig.xml描述符中 声明 ,该描述符包含在核心Seam JAR文件jboss-seam.jar中。 因此, 只要在应用程序中包含此JAR文件,就可以使用阶段侦听器 。
因此,您不必担心SeamPhaseListener。 接缝会。
UPDATE
首先,你有一个耳朵应用程序。 继续之前
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组件能够@Incjection)
org.jboss.seam.ejb.SeamInterceptor * org.jboss.seam.ejb.SeamInterceptor
2ºjboss -seam.jar 是一个EJB模块
所以它也应该在application.xml文件中声明 。 而且,如上所述,您不必定义 SeamPhaseListener,因为jboss-seam.jar包含SeamPhaseListener。 所以避免看到这个好消息
安装了两个SeamPhaseListener实例
所以你的ear application.xml看起来应该是这样的
pureCharger pureCharger-ejb.jar jboss-seam.jar pureCharger-war.war pureCharger
好。 我们走吧
3º您想启用调试页面
如果将此jar与Facelets一起部署在WEB-INF / lib中,并且如果设置了init组件的debug属性,那么Seam调试页面将可用
所以你的components.xml应该是这样的
如上所示, 我已经定义了全局JNDI地址 ( 我假设您使用的是JBoss,而您的耳朵应用程序称为pureCharger),以便Seam检索其EJB组件
最后,我们的web.xml文件
facelets.DEVELOPMENT true javax.faces.DEFAULT_SUFFIX .xhtml javax.faces.STATE_SAVING_METHOD server Seam Filter org.jboss.seam.servlet.SeamFilter Seam Filter /* org.jboss.seam.servlet.SeamListener Faces Servlet javax.faces.webapp.FacesServlet Faces Servlet *.xhtml 30
还有我们的faces-config.xml
en en com.sun.facelets.FaceletViewHandler XX.XXXX.XXX.prs.web.messages.messages msgs XX.XXXX.XXX.prs.web.messages.validation val
几个笔记
您不需要在faces-config.xml中声明org.jboss.seam.el.SeamELResolver,因为它与jboss-seam.jar捆绑在一起 。
现在,错过了什么?
我们需要调用我们的调试页面(不要忘记启动JBoss并部署你的耳朵应用程序)
然后再次
如果你真的想避免很多头痛,可以使用seam-gem
UPDATE
你的耳朵项目如上所示 ??? 请确认您的war lib文件夹不包含任何jboss-seam.jar文件。 你说
我打开了.ear,下面的jbossjar子在:
- 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(右)但它必须在META-INF / application.xml文件中声明
在这里,您可以看到由我提供的关于EJB 2.0和3.0的精彩教程
有关Seam Maven Integration的有用链接
http://www.seamframework.org/Community/MavenWithSeam
http://www.seamframework.org/Documentation/SeamWithMavenOverview
http://www.seamframework.org/Community/SeamInActionChapter2345And6Mavenized
http://www.seamframework.org/Community/MavenSeamArchetype
问候,
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中的设置:
org.jboss.seam jboss-seam
对此:
org.jboss.seam jboss-seam jboss-seam.jar
现在我可以看到我的应用程序和调试页面。
你是什么意思调试页面? 你的意思是默认的Seam调试页面吗? 哪个是debug.seam? 通常是http:// localhost:8080 / debug.seam ?
放入web.xml是不够的。 您还需要放入components.xml
您还需要确保jboss-seam-debug.jar位于类路径中。 Seam的拦截器应该自动选择它。
如果您正在使用Facelets,要获取其调试页面,您需要将其放在web.xml中
facelets.DEVELOPMENT true
来自Arthur的关于总是使用seam-gen来生成项目的提示是一个非常好的主意。
我也看到Arthur说你需要确保jboss-seam-debug.jar在你的战争中不应该在你的lib中。 这不一定正确。 我有我的
myapp.war/WEB-INF/lib/jboss-seam-debug.jar