TestNG does not work with JDK 6. TestNG works only with JDK 5. So, if you have JDK 6 installed on your system, you need to apply a little shrewdness.
I will assume that you already have JBoss Tools and the TestNG Eclipse plugin installed. If you need a tutorial on that, let me know and I’ll write one. I will also assume you are deploying in JBoss AS 5.
Here’s how to create a TestNG-ready Seam 2 project in Eclipse that works with JDK6:
- Create a new Seam 2 Project in Eclipse with the JBoss Tools wizard.
- If you project is gonna have EJBs, make sure you choose “EAR” as deployment at the end of the Wizard (but choose WAR at the Maven page).
- If you create a mavenized project, look for the warning “Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published. Runtime ClassNotFoundExceptions may result.”; rich-click on it, Quick Fix, Finish.
- Now you have the Seam 2 project and a Seam 2 test project
- In the test project, create a simple test class. For example:
- Right-click on the test class and select Run As –> TestNG Test
- If you have JDK 6, the test will fail with a daunting stack trace, and it’s ok. It fails because TestNG does not work with JDK 6, but only with JDK 5. But now, eclipse created a run configuration for us that we can fix.
- Now right-click again on the test class and select Run As –> Run Configurations
- In “Run configurations” window, scroll down and find TesNG –> NameOfYourTestClass
- Select the “(x)=Arguments” tab
- In the “VM Arguments” field past the following:
-Dsun.lang.ClassLoader.allowArraySyntax=true
- Click “Apply” then “Close”
- Right-click again on your test class and select Run As –> TestNG Test. Now the test will run.
- Repeat steps 6 to 12 for every test class you create. Make sure you remember to do so!
- Happy testing!
package test; import org.jboss.seam.mock.SeamTest; import org.testng.annotations.Test; public class Tests extends SeamTest { @Test public void myFirstTest() { assert true; } }
Open a terminal and type the following command:
keytool -genkey -keystore filename.keystore -storepass mypassword -keypass mypassword -keyalg RSA -validity 180 -alias somealias -dname "cn=Name Surname,o=MyCompany,c=US"
(change the command parameters properly )
The command will create a self-signed certificate, stored in the .keystore file.
Copy the .keystore file to JBOSS_AS_7_HOME/standalone/configuration
Open JBOSS_AS_7_HOME/standalone/configuration/standalone.xml
Look for the following element:
<subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host"> <connector name="http" protocol="HTTP/1.1" socket-binding="http" scheme="http"/> <virtual-server name="default-host" enable-welcome-root="true"> <alias name="localhost"/> <alias name="example.com"/> </virtual-server> </subsystem>
Change it to make it look like this:
<subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host"> <connector name="http" protocol="HTTP/1.1" socket-binding="http" scheme="http"/> <connector name="https" protocol="HTTP/1.1" socket-binding="https" scheme="https" secure="true"> <ssl key-alias="somealias" password="mypassword" certificate-key-file="../standalone/configuration/filename.keystore" cipher-suite="ALL" protocol="TLS"/> </connector> <virtual-server name="default-host" enable-welcome-root="true"> <alias name="localhost"/> <alias name="example.com"/> </virtual-server> </subsystem>
Restart JBoss AS 7.
Notice the following lines in the console output/log:
17:45:21,689 INFO [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-4) Starting Coyote HTTP/1.1 on http--127.0.0.1-8080
17:45:22,138 INFO [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-3) Starting Coyote HTTP/1.1 on http--127.0.0.1-8443
HTTPS will be running on port 8443 by default.
To change the HTTPS port, look for the socket-binding-group
element in standalone.xml
Intro
One of of Seam 2′s coolest features was the workspace management feature. (this must me the billionth times someone says that )
With the advent of Java EE 6 & and CDI, one would expect that the implementation of such a cool feature would be top priority to the Seam 3 tem, but – hey! – It’s JBoss we are talking about! So no, there is no conversation/workspace management in Seam 3 :-/
Andy Gibson’s solution
Andy Gibson implemented a basic workspace manager; I tested it out with JBoss AS 7.0.2.Final and it worked. Here are the pros and cons of Andy’s solution:
Pros:
- It uses the standard CDI specification API.
- It’s portable across different Java EE 6 application servers.
- It’s extensible in that you can, for example, associate descriptions (i.e. use case names) to conversations.
Cons:
- You have to clutter your CDI bean’s code with workspace management code – which is poor separation of concerns.
Here comes Weld
Weld (JBoss’ implementation of CDI) offers the possibility to implement workspace management in a different, more elegant way. Weld introduces the notion of a ManagedConversation
, which extends the Conversation
interface with the abilty to lock, unlock and touch (update the last used timestamp) a conversation; it also adds a method to get the timestamp of the moment when conversation was last used. Finally, all non-transient conversations in a session can be obtained from the ConversationContext
, as can the current conversation.
My workspace management solution is build upon Weld’s perks. Here are its pros and cons:
Pros:
- You don’t have to add workspace management code to your CDI bean.
- You don’t even have to inject anything into yout CDI beans.
- It allows for separation of concerns.
Cons:
- It’s depends on Weld.
- It only works with JBoss AS 6/7.
- It’s not portable across different CDI implementations (i.e. won’t work on Glassfish, WebSphere, etc…).
My solution’s source code
package cdi; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.inject.Named; import org.jboss.solder.logging.Logger; import org.jboss.weld.context.ConversationContext; import org.jboss.weld.context.ManagedConversation; import org.jboss.weld.context.http.Http; import util.ManagedConversationComparator; /** * This bean needs <strong>Weld</strong>. * * @author Luca * */ @Named @RequestScoped public class WorkspaceBean implements Serializable { private static final long serialVersionUID = -457959303651081423L; @Inject @Http private ConversationContext conversationContext; @Inject private Logger logger; /** * Tells whether a ManagedConversation has timed out. * * @param conv * @return <i>true</i> if it has timed out; <i>false</i> if it has not timed * out yet */ public static boolean timedOut(ManagedConversation conv) { return conv.getTimeout() < (new Date().getTime() - conv.getLastUsed()); } /** * Get the list of active (long running OR once long-running, then timed-out * but still active) conversation Id's. * * @return a List<String> of conversation ids */ public List<String> getActiveConversationIds() { List<String> result = new ArrayList<String>(); for (Iterator<ManagedConversation> i = getActiveConversations() .iterator(); i.hasNext();) { result.add(i.next().getId()); } return result; } /** * Get a list of the active ManagedConversation. To be in the list, a * conversations must satisfy one of these two requirements: * <ul> * <li>It's long running and has not timed out yet;</li> * <li>It was long running and has timed out.</li> * </ul> * The list does NOT contain transient conversations. * * @return a Collection of org.jboss.weld.context.ManagedConversation, * sorted by conversation id. */ public Collection<ManagedConversation> getActiveConversations() { List<ManagedConversation> result = new ArrayList<ManagedConversation>( conversationContext.getConversations()); // Weld's documentation reads: // "conversations are not assigned ids until they become non-transient." // Actually, that's not the case! ConversationContext.getConversations() // lacks the current conversation even though it's already long running! // // We workaround by adding the current conversation, if it's long // running. ManagedConversation currentConversation = conversationContext .getCurrentConversation(); if (!currentConversation.isTransient()) { if (!result.contains(currentConversation)) result.add(currentConversation); } // Sort the conversations by conversation id in ascending order Collections.sort(result, new ManagedConversationComparator()); return result; } /** * Get the list of active, long running, not yet timed-out conversation * Id's. * * @return */ public List<String> getLongRunningConversationIds() { List<String> result = new ArrayList<String>(); for (Iterator<ManagedConversation> i = getLongRunningConversations() .iterator(); i.hasNext();) { result.add(i.next().getId()); } return result; } /** * Get all AND ONLY the <strong>long running</strong> active conversations * that haven't timed out yet. * * @return a Collection of long running * org.jboss.weld.context.ManagedConversation, sorted by * conversation id. */ public Collection<ManagedConversation> getLongRunningConversations() { Collection<ManagedConversation> result = new ArrayList<ManagedConversation>(); ManagedConversation conv; // Get all the active conversations Collection<ManagedConversation> activeConversations = getActiveConversations(); for (Iterator<ManagedConversation> i = activeConversations.iterator(); i .hasNext();) { conv = i.next(); // If the conversation is STILL long running, add it to the result if (!timedOut(conv)) { result.add(conv); } } return result; } /** * Logs info about the workspace */ private void output() { logger.info("Current Conversation: " + conversationContext.getCurrentConversation()); logger.info("Long Running Conversations: "); Iterator<ManagedConversation> i = getLongRunningConversations() .iterator(); while (i.hasNext()) { logger.info(i.next()); } logger.info("Active Conversations: "); i = getActiveConversations().iterator(); while (i.hasNext()) { logger.info(i.next()); } } /* * Life cycle methods */ @PostConstruct public void postConstruct() { logger.info("postConstruct()"); output(); } @PreDestroy public void preDestroy() { logger.info("preDestroy()"); output(); } }
Here’s an .xhtml snippet that displays the workspace:
<h1>Long Running Conversations</h1> <ui:repeat var="_conv" value="#{workspaceBean.longRunningConversations}"> <h:link outcome="wizard2" value="Goto Conversation #{_conv.id}"> <f:param name="cid" value="#{_conv.id}" /> </h:link> <br/> </ui:repeat> <h1>Active</h1> <ui:repeat var="_conv" value="#{workspaceBean.activeConversations}"> <h:link outcome="wizard2" value="Goto Conversation #{_conv.id}"> <h:outputText value=" (timedout)" rendered="#{workspaceBean.timedOut(_conv)}"/> <f:param name="cid" value="#{_conv.id}" /> </h:link> <br /> </ui:repeat>
Some remarks
- Weld’s
ManagedConversation
andConversationContext
are cool; however, they are not part of the CDI specification; I’d prefer them to be part of some CDI extension – Seam Solder, for instance – and not of Weld itself. - It would be useful if the
ManagedConversation
had methods to set and get the conversation description (i.e. use case name), because it’s needed by 90% of Web apps. - A
boolean ManagedConversation.isTimedOut()
method would be very useful too (we would not need to implement a Comparator) - It would also be very useful to be able to observe/intercept
Conversation.begin()
,Conversation.timeout()
,Conversation.end()
In this post I’ll be using:
- JBoss AS 7.0.2.Final
- Seam Solder 3.1.0.Final
Here’s my adventure in dealing with NonexistentConversationException…
Round 1
If you request a page with a non existent conversation id, a javax.enterprise.context.NonexistentConversationException
will be thrown.
For example, if you type something like: http://localhost:8080/myapp/somePageWithAConversationScopedBean.jsf?cid=someNonExistentCid
You’ll see this page:
HTTP Status 500 - type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception javax.enterprise.event.ObserverException sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) java.lang.reflect.Constructor.newInstance(Constructor.java:513) java.lang.Class.newInstance0(Class.java:355) java.lang.Class.newInstance(Class.java:308) org.jboss.weld.util.reflection.SecureReflections$16.work(SecureReflections.java:395) org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54) org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInstantiation(SecureReflectionAccess.java:216) org.jboss.weld.util.reflection.SecureReflections.newInstance(SecureReflections.java:390) org.jboss.weld.injection.Exceptions.rethrowException(Exceptions.java:40) org.jboss.weld.injection.Exceptions.rethrowException(Exceptions.java:92) org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:214) org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:282) org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:265) org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:234) org.jboss.weld.manager.BeanManagerImpl.notifyObservers(BeanManagerImpl.java:635) org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:622) org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:616) org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:74) org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74) root cause javax.servlet.ServletException: WELD-000321 No conversation found to restore for id 989 javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65) org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74) root cause org.jboss.weld.context.NonexistentConversationException: WELD-000321 No conversation found to restore for id 989 org.jboss.weld.jsf.WeldPhaseListener.activateConversations(WeldPhaseListener.java:112) org.jboss.weld.jsf.WeldPhaseListener.beforePhase(WeldPhaseListener.java:88) com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65) org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74) note The full stack trace of the root cause is available in the JBoss Web/7.0.1.Final logs. JBoss Web/7.0.1.Final
Joshua Davis suggests a workaround that *should* solve the problem: http://shrubbery.mynetgear.net/c/display/W/Handling+NonexistentConversationException+Gracefully
The forum thread is: http://seamframework.org/Community/HandlingNonexistentConversationExceptionWithSeam3
Add this property to your pom.xml…
<properties> <seam.solder.version>3.1.0.Final</seam.solder.version> </properties>
…add these dependencies to your pom.xml:
<dependency> <groupId>org.jboss.solder</groupId> <artifactId>solder-api</artifactId> <version>${seam.solder.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.jboss.solder</groupId> <artifactId>solder-impl</artifactId> <version>${seam.solder.version}</version> <scope>runtime</scope> </dependency>
…and create this class:
package solder; import javax.enterprise.context.NonexistentConversationException; import javax.inject.Inject; import org.jboss.solder.exception.control.CaughtException; import org.jboss.solder.exception.control.Handles; import org.jboss.solder.exception.control.HandlesExceptions; import org.jboss.solder.logging.Logger; @HandlesExceptions public class MyHandlers { @Inject private Logger log; public void onNonexistentConversation(@Handles CaughtException evt) { log.error("NonexistentConversationException! " + evt.getException().getMessage(), evt.getException()); evt.handled(); } }
You get this page:
HTTP Status 500 - type Status report message description The server encountered an internal error () that prevented it from fulfilling this request. JBoss Web/7.0.1.Final
and this output:
13:50:48,245 ERROR [solder.MyHandlers] (http--127.0.0.1-8080-1) NonexistentConversationException! WELD-000321 No conversation found to restore for id 989: org.jboss.weld.context.NonexistentConversationException: WELD-000321 No conversation found to restore for id 989 at org.jboss.weld.jsf.WeldPhaseListener.activateConversations(WeldPhaseListener.java:112) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.jsf.WeldPhaseListener.beforePhase(WeldPhaseListener.java:88) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65) [solder-impl-3.1.0.Final.jar:] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74) [solder-impl-3.1.0.Final.jar:] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at java.lang.Thread.run(Thread.java:662) [:1.6.0_26]
This happens because of a known Weld bug: https://issues.jboss.org/browse/WELD-855
Joshua Davis’ workaround consists of telling Weld to create a new Transient conversation.
Modify our solder.MyHandlers.java:
package solder; import javax.enterprise.context.NonexistentConversationException; import javax.inject.Inject; import org.jboss.solder.exception.control.CaughtException; import org.jboss.solder.exception.control.Handles; import org.jboss.solder.exception.control.HandlesExceptions; import org.jboss.solder.logging.Logger; import org.jboss.weld.context.http.HttpConversationContext; @HandlesExceptions public class MyHandlers { @Inject private Logger log; public void onNonexistentConversation(@Handles CaughtException evt, HttpConversationContext conversationContext) { log.error("NonexistentConversationException! " + evt.getException().getMessage(), evt.getException()); evt.handled(); conversationContext.activate(null); // Workaround WELD-855 - Create a new transient conversation. } }
So far, this is the solution suggested in the wiki…
Guess what? It. does. not. work. (You still get HTTP Error 500.):-/
At least, it does not work with JBoss AS 7.0.2.Final and Seam Solder 3.1.0.Final, which are the version I’m using. Joshua didn’t mention which version he tested his workaround against, by the way. When you write an article, you have to ALWAYS mention the versions!!!
My workaround is the following:
package solder; import java.io.IOException; import javax.enterprise.context.NonexistentConversationException; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jboss.solder.exception.control.CaughtException; import org.jboss.solder.exception.control.Handles; import org.jboss.solder.exception.control.HandlesExceptions; import org.jboss.solder.logging.Logger; import org.jboss.weld.context.http.HttpConversationContext; @HandlesExceptions public class MyHandlers { @Inject private Logger log; public void onNonexistentConversation(@Handles CaughtException evt, HttpServletRequest request, HttpServletResponse response) { log.error("NonexistentConversationException! " + evt.getException().getMessage()); evt.handled(); // We redirect to the same page, but without cid. This will trigger a new JSF request lifecycle // and start a new transient conversation. // The drawback is: we cannot append messages to the view, because there is no active FacesContext. String redirectURL = response.encodeRedirectURL(request.getRequestURL().toString()); try { response.sendRedirect(redirectURL); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Round 2
Turns out Joshua Davis uses Seam Solder version 3.1.0.Beta2. So, I change my configuration.
My dependencies now are:
<properties> <seam.version>3.1.0.Beta2</seam.version> <weld.version>1.1.2.Final</weld.version> </properties> <dependencies> <dependency> <groupId>org.jboss.seam.solder</groupId> <artifactId>seam-solder</artifactId> <version>${seam.version}</version> </dependency> <dependency> <groupId>org.jboss.seam.catch</groupId> <artifactId>seam-catch</artifactId> <version>${seam.version}</version> </dependency> <dependency> <groupId>org.jboss.seam.faces</groupId> <artifactId>seam-faces</artifactId> <version>${seam.version}</version> </dependency> <!-- seam-faces depends on prettyfaces --> <dependency> <groupId>com.ocpsoft</groupId> <artifactId>prettyfaces-jsf2</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>org.jboss.weld</groupId> <artifactId>weld-core</artifactId> <version>${weld.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-6.0</artifactId> <version>1.0.0.Final</version> <type>pom</type> <scope>provided</scope> </dependency> </dependencies>
seam-solder 3.1.0.Beta2 also needs the jboss-deployment-structure.xml
file for logging to work:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <module name="org.jboss.logmanager" /> </dependencies> </deployment> </jboss-deployment-structure>
By the way, @Inject Logger logger
in a PhaseListener
doesn’t work in seam-solder 3.1.0.Beta2
The exception handler is now as follows:
package solder; import javax.enterprise.context.NonexistentConversationException; import javax.inject.Inject; import org.jboss.seam.exception.control.CaughtException; import org.jboss.seam.exception.control.Handles; import org.jboss.seam.exception.control.HandlesExceptions; import org.jboss.seam.logging.Logger; import org.jboss.weld.context.http.HttpConversationContext; @HandlesExceptions public class JoshuaHandlers { @Inject private Logger logger; public void onNonexistentConversation( @Handles CaughtException evt, HttpConversationContext conversationContext) { java.awt.Toolkit.getDefaultToolkit().beep(); // I added a sound effect ;P logger.error("NonexistentConversationException!\n" + evt.getException().getMessage(), evt.getException()); evt.handled(); } }
Now, if I enter a non existent cid, this is the page I get:
HTTP Status 500 - type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception javax.servlet.ServletException: WELD-001303 No active contexts for scope type javax.enterprise.context.ConversationScoped javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126) root cause org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.ConversationScoped org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:667) org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:77) org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:87) cdi.SomeCDIBean$Proxy$_$$_WeldClientProxy.getNum(SomeCDIBean$Proxy$_$$_WeldClientProxy.java) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) javax.el.BeanELResolver.getValue(BeanELResolver.java:302) com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) org.apache.el.parser.AstValue.getValue(AstValue.java:134) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187) org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:55) com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) javax.faces.component.UIOutput.getValue(UIOutput.java:169) com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164) javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312) com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304) com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185) com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(PrettyViewHandler.java:163) javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126) note The full stack trace of the root cause is available in the JBoss Web/7.0.1.Final logs. JBoss Web/7.0.1.Final
…and this is the output:
23:18:51,861 ERROR [solder.JoshuaHandlers] (http--127.0.0.1-8080-1) NonexistentConversationException! WELD-000321 No conversation found to restore for id 778: org.jboss.weld.context.NonexistentConversationException: WELD-000321 No conversation found to restore for id 778 at org.jboss.weld.jsf.WeldPhaseListener.activateConversations(WeldPhaseListener.java:112) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.jsf.WeldPhaseListener.beforePhase(WeldPhaseListener.java:88) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126) [prettyfaces-jsf2-3.3.2.jar:] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at java.lang.Thread.run(Thread.java:662) [:1.6.0_26] 23:18:51,867 INFO [faces.phaselisteners.MyPhaseListener] (http--127.0.0.1-8080-1) Before Phase: RENDER_RESPONSE 6 23:18:51,908 GRAVE [javax.enterprise.resource.webcontainer.jsf.application] (http--127.0.0.1-8080-1) Error Rendering View[/wizard2.xhtml]: javax.el.ELException: /wizard2.xhtml @16,65 value="#{someCDIBean.num}": org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.ConversationScoped at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.component.UIOutput.getValue(UIOutput.java:169) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(PrettyViewHandler.java:163) [prettyfaces-jsf2-3.3.2.jar:] at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126) [prettyfaces-jsf2-3.3.2.jar:] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at java.lang.Thread.run(Thread.java:662) [:1.6.0_26] Caused by: org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.ConversationScoped at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:667) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:77) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:87) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at cdi.SomeCDIBean$Proxy$_$$_WeldClientProxy.getNum(SomeCDIBean$Proxy$_$$_WeldClientProxy.java) [classes:] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_26] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_26] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_26] at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_26] at javax.el.BeanELResolver.getValue(BeanELResolver.java:302) [jboss-el-api_2.2_spec-1.0.0.Final.jar:1.0.0.Final] at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at org.apache.el.parser.AstValue.getValue(AstValue.java:134) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:55) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] ... 45 more 23:18:51,912 INFO [faces.phaselisteners.MyPhaseListener] (http--127.0.0.1-8080-1) After Phase: RENDER_RESPONSE 6 23:18:51,917 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/as702sandboxWarMaven].[facesServlet]] (http--127.0.0.1-8080-1) Servlet.service() for servlet facesServlet threw exception: org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.ConversationScoped at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:667) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:77) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:87) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at cdi.SomeCDIBean$Proxy$_$$_WeldClientProxy.getNum(SomeCDIBean$Proxy$_$$_WeldClientProxy.java) [classes:] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_26] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_26] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_26] at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_26] at javax.el.BeanELResolver.getValue(BeanELResolver.java:302) [jboss-el-api_2.2_spec-1.0.0.Final.jar:1.0.0.Final] at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at org.apache.el.parser.AstValue.getValue(AstValue.java:134) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:55) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.component.UIOutput.getValue(UIOutput.java:169) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(PrettyViewHandler.java:163) [prettyfaces-jsf2-3.3.2.jar:] at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126) [prettyfaces-jsf2-3.3.2.jar:] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at java.lang.Thread.run(Thread.java:662) [:1.6.0_26]
Uhm… this might be what the wiki talks about.
Now, let’s try the workaround again. The exception handler is as follows:
package solder; import javax.enterprise.context.NonexistentConversationException; import javax.inject.Inject; import org.jboss.seam.exception.control.CaughtException; import org.jboss.seam.exception.control.Handles; import org.jboss.seam.exception.control.HandlesExceptions; import org.jboss.seam.logging.Logger; import org.jboss.weld.context.http.HttpConversationContext; @HandlesExceptions public class JoshuaHandlers { @Inject private Logger logger; public void onNonexistentConversation( @Handles CaughtException evt, HttpConversationContext conversationContext) { java.awt.Toolkit.getDefaultToolkit().beep(); // I added a sound effect ;P logger.error("NonexistentConversationException!\n" + evt.getException().getMessage(), evt.getException()); evt.handled(); conversationContext.activate(null); // Workaround WELD-855 - Create a new transient conversation. } }
Yes! The view now renders
, and the console output is:
23:17:15,706 ERROR [solder.JoshuaHandlers] (http--127.0.0.1-8080-1) NonexistentConversationException! WELD-000321 No conversation found to restore for id 778: org.jboss.weld.context.NonexistentConversationException: WELD-000321 No conversation found to restore for id 778 at org.jboss.weld.jsf.WeldPhaseListener.activateConversations(WeldPhaseListener.java:112) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.jsf.WeldPhaseListener.beforePhase(WeldPhaseListener.java:88) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126) [prettyfaces-jsf2-3.3.2.jar:] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at java.lang.Thread.run(Thread.java:662) [:1.6.0_26] 23:17:15,716 INFO [faces.phaselisteners.MyPhaseListener] (http--127.0.0.1-8080-1) Before Phase: RENDER_RESPONSE 6 23:17:16,042 INFO [faces.phaselisteners.MyPhaseListener] (http--127.0.0.1-8080-1) After Phase: RENDER_RESPONSE 6
So, what changed? The main differences between my configuration and Joshua’s are:
- Different Seam version (me 3.1.0.Final, him 3.1.0.Beta2)
- Added seam-faces (and its transitive dependencies: seam-imternational, joda-time, prettyfaces-jsf2)
I thinks seam-faces plays a great role in all this. So, I’l try to revert my configuration back to how it was at the beginning, and I will add seam-faces.
[...later...]
Yes! seam-faces was the missing piece.
Here’s the working pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.mycompany</groupId> <artifactId>SomeProject</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>SomeProject</name> <build> <sourceDirectory>${basedir}/src</sourceDirectory> <outputDirectory>${basedir}/build/classes</outputDirectory> <resources> <resource> <directory>${basedir}/src</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <warSourceDirectory>${basedir}/WebContent</warSourceDirectory> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> <properties> <seam.version>3.1.0.Final</seam.version> <weld.version>1.1.2.Final</weld.version> </properties> <repositories> <repository> <id>JBoss1</id> <name>Public Repository Group</name> <url>https://repository.jboss.org/nexus/content/groups/public/</url> </repository> <repository> <id>JBoss2</id> <name>Public JBoss Repository Group</name> <url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url> </repository> <repository> <id>JBoss3</id> <name>JBoss Releases</name> <url>https://repository.jboss.org/nexus/content/repositories/releases/</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-6.0</artifactId> <version>1.0.0.Final</version> <type>pom</type> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.weld</groupId> <artifactId>weld-core</artifactId> <version>${weld.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.jboss.solder</groupId> <artifactId>solder-api</artifactId> <version>${seam.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.jboss.solder</groupId> <artifactId>solder-impl</artifactId> <version>${seam.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.jboss.seam.faces</groupId> <artifactId>seam-faces-api</artifactId> <version>${seam.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.jboss.seam.faces</groupId> <artifactId>seam-faces</artifactId> <version>${seam.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.jboss.seam.international</groupId> <artifactId>seam-international-api</artifactId> <version>${seam.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.jboss.seam.international</groupId> <artifactId>seam-international</artifactId> <version>${seam.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>com.ocpsoft</groupId> <artifactId>prettyfaces-jsf2</artifactId> <version>3.3.2</version> </dependency> </dependencies> </project>
Here’s the working exception handler:
package solder; import javax.enterprise.context.NonexistentConversationException; import javax.inject.Inject; import org.jboss.solder.exception.control.CaughtException; import org.jboss.solder.exception.control.Handles; import org.jboss.solder.exception.control.HandlesExceptions; import org.jboss.solder.logging.Logger; import org.jboss.weld.context.http.HttpConversationContext; @HandlesExceptions public class JoshuaHandlers { @Inject private Logger logger; public void onNonexistentConversation( @Handles CaughtException<NonexistentConversationException> evt, HttpConversationContext conversationContext) { java.awt.Toolkit.getDefaultToolkit().beep(); logger.error("NonexistentConversationException!\n" + evt.getException().getMessage(), evt.getException()); evt.handled(); conversationContext.activate(null); // Workaround WELD-855 - Create a new transient conversation. } }
In the next posts I’ll show how to implement a Workspace Manager (a-la Seam 2).