Jboss Seam: Включение страницы отладки в WebLogic 10.3.2 (11g)
Пропустить до обновления 3
Я хочу включить страницу отладки Seam в Weblogic 10.3.2 (11g). Итак, я сделал следующее:
У меня есть jarss-seam и jboss-seam-debug jar в качестве зависимости как в моих проектах ejb, так и в web-maven (оба являются модулями моего суперпроекта). Я поместил этот контекстный параметр в свой 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 с сообщением: "Нет идентификатора фазы, привязанного к текущему потоку (убедитесь, что у вас не установлено два экземпляра SeamPhaseListener)"
Из сообщений, которые я прочитал, кажется, что это как-то связано с двумя jar-файлами jboss-seam или jboss-seam-debug, находящимися в пути к классам. Я открыл файл с ушами, и только один из них присутствует (в ухе), тогда как у самой войны нет библиотек в WEB-INF/lib.
Я также читал о другом способе инициализации страницы отладки с использованием component.xml. Я также попытался включить следующий компонент.xml в WEB-INF, но он тоже не работал:
<?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 банки находятся в:
- JBoss шва Неотладочная-2.2.0.GA.jar
- JBoss-эль-1.0_02.CR4.jar
- JBoss шва-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>
-> Сервлет ресурсов шва servlet-name>-> org.jboss.seam.servlet.SeamResourceServlet servlet-class>-> -> -> Сервлет ресурсов шва servlet-name>-> /seam/resource/* url-pattern>-> ->
<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:
У этих ребят тут такая же проблема. У них есть внешний проект EAR, содержащий внутренний проект WAR. Они обсуждают, что это может быть связано с тем, как банки оказываются в проектах.
Я использую Maven, и я настроил его для создания "Skinny Wars", который исключает все зависимости jar из внутреннего проекта WAR, поэтому он остается небольшим по размеру. Все его зависимости содержатся в EAR и используются всеми другими модулями.
Я изменил настройки плагина maven-war-plugin, чтобы оставить внутри войны специфичные для сети банки (упомянутые в ссылке, такие как RichFaces, jboss-seam-debug, Facelets и т. Д.).
Однако проблема вернулась к своей прежней форме. Теперь я получаю страницу отладки, какую бы ссылку я ни нажимал, за первоначальным исключением.
Вызвано java.lang.IllegalStateException с сообщением: "Нет идентификатора фазы, привязанного к текущему потоку (убедитесь, что у вас не установлено два экземпляра 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 в ухе) приложение загружается правильно.
При развертывании WITH jboss-seam-debug.jar в EAR (каталог EAR/lib) приложение не появляется, а ТОЛЬКО на странице отладки со следующим исключением (stacktrace в конце):
Исключение при обработке запроса:
Вызвано java.lang.IllegalStateException с сообщением: "Нет идентификатора фазы, привязанного к текущему потоку (убедитесь, что у вас не установлено два экземпляра SeamPhaseListener)"
Когда "JBoss-izing" тот же EAR (удалите jibernate jar, которые предоставляются JBoss, и переместите все библиотеки из EAR/lib в корень EAR), приложение загружается правильно. ОБА приложение и страница отладки отображаются правильно.
Полная трассировка стека:
org.jboss.seam.contexts.PageContext.getPhaseId (PageContext.java:163) org.jboss.seam.contexts.PageContext.isBeforeInvokeApplicationPhase (PageContext.java:175) org.jboss.seamurConcontext 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.restorePageConagateConversationConversation 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. 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:22St.invokeServlet(StubSecurityHelper.java:125). weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292) 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. или.) seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) org.jboss.seam.servlet. Java:69) org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.we.RedirectFilter.doFilter(RedirectFilter.java! webapp.BaseFilter.handleRequest(BaseFilter.java:290) org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) org.ajax4jsf.webapp.BaseFilter.doilss.j.f.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.web.LoggingFilter.doFilter.jpg ().jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) org.jboss.seam.servilFF SeamFilter.java:69) org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) RequestEventsFilter.java:27) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run.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.reworklIreRelImpReIvlet_ServServServServ execute(ExecuteThread.java:201) weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
3 ответа
Причина, по которой Seam на странице отладки не появился, невероятна (для меня).
Я упаковал свое приложение с Apache Maven. Традиционно имена файлов jar, управляемых maven, также содержат номер версии. Баночка для шва: jboss- seam -2.2.0.GA.jar. Поскольку Seam является EJB-модулем в приложении, я объявил его зависимость как таковую. И действительно, EAR содержал его как модуль EJB (расположенный в корне EAR) и также объявил его в файле META-INF/application.xml.
Я не знаю, определяет ли спецификация ограничения именования для модулей EJB в EAR, но часть версии имени файла была тем, что WebLogic не понравилось (если изменить, война отлично работает на JBoss).
Я изменил настройку в плагине maven-ear из этого:
<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>
И теперь я вижу ОБА мое приложение И страницу отладки.
Вы получаете следующее исключение
Никакой идентификатор фазы не привязан к текущему потоку (убедитесь, что у вас не установлено два экземпляра SeamPhaseListener)
Но вы сказали, что установили проект ejb и web maven. Возможно, оба варианта включают SeamPhaseListener при развертывании приложения. Это, возможно, объясняет, почему вы получаете свое исключение (установлены два экземпляра SeamPhaseListener).
Мой совет (и если вы хотите избежать головной боли)
Всегда создавайте свой проект с помощью Seam-gem
Смотрите здесь, почему
Хорошая статья, помимо книги Seam in Action, о JSF/Seam может быть найдена здесь
Добавлено в исходный ответ
Посмотрите, что об этом говорит книга "Шов в действии"
В Seam 2.0 прослушиватель фазы Seam объявляется в дескрипторе FaceSconfig.xml, который включен в основной файл JAR Seam, jboss-seam.jar. Таким образом, слушатель фазы доступен, как только вы включите этот JAR-файл в свое приложение.
Таким образом, вам не нужно беспокоиться о SeamPhaseListener. Шов будет.
ОБНОВИТЬ
Прежде всего, у вас есть приложение для ушей. Перед тем как продолжить
1º Каждый EJB и военный модуль должны быть объявлены в 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 показан следующим образом (он включает @In-jection вашими компонентами EJB)
<?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 развернут в WEB-INF/lib вместе с Facelets, и если вы установите свойство debug компонента init
Таким образом, ваш компонент.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, а ваше ушное приложение называется 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>
И наши лица-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>
Пара заметок
Вам не нужно объявлять org.jboss.seam.el.SeamELResolver в face-config.xml, потому что он связан с jboss-seam.jar.
Теперь, что пропущено?
Нам нужно вызвать нашу страницу отладки (не забудьте запустить JBoss и развернуть ваше ушное приложение)
И опять
Если вы действительно хотите избежать головной боли, используйте seam-gem
ОБНОВИТЬ
Ваш ушной проект как показано выше??? УБЕДИТЕСЬ, что папка war lib НЕ содержит ни одного файла jboss-seam.jar. Вы сказали
Я открыл.ear и следующие jboss банки находятся в:
- jboss-seam-debug-2.2.0.GA.jar (неверно). Он должен быть помещен в папку war-файла WEB-INF/lib
- jboss-el-1.0_02.CR4.jar (неверно) Он должен быть помещен в папку lib файла ear
- jboss-seam-2.2.0.GA.jar (справа) Но он должен быть объявлен в файле ear META-INF/application.xml
Здесь вы можете увидеть хороший учебник по 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
С уважением,
Что вы имеете в виду страницу отладки? Вы имеете в виду страницу отладки Seam по умолчанию? Что такое debug.seam? Обычно http://localhost:8080/debug.seam?
Недостаточно положить в web.xml. Вы также должны положить в компонент.xml
<core:init debug="true" jndi-pattern="myApp/#{ejbName}/local"/>
Вы также должны убедиться, что jboss-seam-debug.jar находится в classpath. Перехватчик шва должен поднять это автоматически.
Если вы используете Facelets, чтобы получить его страницу отладки, вам нужно поместить это в web.xml
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
Совет от Артура о том, чтобы всегда использовать seam-gen для генерации вашего проекта - очень хорошая идея.
Я также вижу, что Артур говорит, что вам нужно убедиться, что jboss-seam-debug.jar не должен быть в вашей библиотеке в вашей войне. Это не обязательно правильно. У меня есть мой в
myapp.war/WEB-INF/lib/jboss-seam-debug.jar