Adding jar files to Seam deployment

If you look in the /lib directory of your seam-gen project you will see several jar files that Seam makes available. All of these jars are included in the classpath but keep in mind that just because these jar files are in the lib directory doesn’t mean they will be packed and deployed to the app server.

Seam uses the deployed-jars.list for WAR projects and deployed-jars-war.list and deployed-jars-ear.list for EAR projects to select which jars are packaged and deployed. These files are located in the root directory of your project.

If you want to add a jar file to your Seam deployment all you have to do is add the jar file name to the deployed-jars file and redeploy. If you are adding a jar file that is located somewhere else besides the lib directory you will also have to make sure the jar is in your classpath.

Using Seam s:validateEquality to compare two fields for equality

I sometimes forget about some of the built in Seam Converters and Validators. While working on a project recently I had a requirement that had two password fields. This was to ensure that the password was spelled correctly. Pretty standard stuff when registering a new user. When I got to this requirement I started to roll my own validator and then remembered Seam had already done this for me. Here is the code.

<s:decorate id="passwordField" template="layout/new.xhtml">
  <ui:define name="label">Password:</ui:define>
  <h:inputSecret id="password" value="#{user.password}" required="true" immediate="true" redisplay="true">
    <a:support event="onblur" bypassUpdates="true" ajaxSingle="true" reRender="passwordField"/>
<s:decorate id="verifyPasswordField" template="layout/new.xhtml">
  <ui:define name="label">Verify Password:</ui:define>
  <h:inputSecret id="verifyPassword" value="#{register.verifyPassword}" required="true" redisplay="true">
    <a:support event="onblur" bypassUpdates="true" ajaxSingle="true" reRender="verifyPasswordField"/>
    <s:validateEquality for=":#{rich:clientId('password')}" message="Passwords don't match." />

That is all there is to it. Pretty slick. Now when the user tabs or clicks out of the Verify Password field the two fields are compared for equality and if they aren’t equal a validation error is displayed so the user can be made aware that there was a spelling mistake.

One thing to keep in mind is that there is a bug in this validator and the way it finds the id. In the Seam documentation example it shows the following.

<s:validateEquality for ="password"/>

When I tried this it didn’t work.

After some digging around in the Seam forums I found a post explaining that this was a bug and needed to be changed to the following.

<s:validateEquality for=":#{rich:clientId('password')}/>

The s:validateEquality can not only check for equality but it can also check for not equal, greater than, greater than or equal to, less than, and less than or equal to. Check out the Seam documentation for the complete listing of attributes.

Seam redeployment loop to JBOSS AS 5.1.0

Today I was working on a Seam project and after modifying the pages.xml file and re-exploding to JBOSS the application server went into a loop and kept re-exploding over and over.

After some digging around I found out that it is a bug in JBOSS AS 5.1 and is being fixed in 5.2. Basically it is due to an Eclipse temp file being in either your WEB-INF/ or META-INF directory. The temp files to look for are either *.jsfdia or *.spdia and can be deleted. In my case the file was named pages.xml.spdia and was located in the WEB-INF/ directory along with my pages.xml file that was modified. After I deleted the file and re-exploded everything worked just fine.