Seam 2.1 Migration Guide
========================
Before you get started with Seam 2.1, there are a few things you should be aware
of. This process should not be too painful - if you get stuck, just refer back
to the updated Seam examples.
This migration guide assumes you are using Seam 2.0, if you are migrating from
Seam 1.2, see the seam2migration guide as well.
Testing
-------
SeamTest now boots Seam at the start of each suite, rather than the start of
each class. This is much faster. See the reference manual for how to alter the
default.
DTDs and Schemas
----------------
The DTDs for Seam XML files are no longer supported. Please use the XML schemas
for validation. Files that use the Seam 2.0 XSDs should be updated to refer to
the 2.1 XSDs
Exception Handling
------------------
The caught exception is now available in EL as #{org.jboss.seam.caughtException}
rather than #{org.jboss.seam.exception}
EntityConverter configuration
-----------------------------
If you need to configure which entity manager to use, this is now done on the
entity-loader component. See the documentation for details.
Assumed name for managed Hibernate session
------------------------------------------
Several areas of Seam, including the Seam Application Framework, rely on a
naming convention for the Seam-managed persistence context (JPA) and Hibernate
session. Prior to Seam 2.1, the assumed name of the managed Hibernate session
was "session". However, session is a very overloaded name in Seam and the Java
Servlet API. To make it less ambigous, the default was changed to
"hibernateSession".
The benefit now is that when you inject or resolve the Hibernate session, you
know that is the refernece you are getting (rather than the HTTP session, mail
session, or some other "session").
You would inject it as follows:
@In private Session hibernateSession;
or
@In(name = "hibernateSession") private Session session;
If the name of your Seam-managed Hibernate session is "session", you can still
inject this reference explictly using the session property:
The alternative is to override the getPersistenceContextName() method on any
persistence controller in the Seam Application Framework:
public String getPersistenceContextName() {
"session";
}
Security
--------
If you are using rule-based security in your project, the configuration for the
security rules in components.xml has changed. Previously, the rules were configured
as a property of the identity component as such:
In Seam 2.1, rule-based permission checks are now carried out by the ruleBasedPermissionResolver
component. You must activate this component and register the security rules with it instead of the
identity component:
IMPORTANT! The definition of a permission has also changed. Prior to Seam 2.1, a permission
consisted of three elements:
* name
* action
* contextual object (optional)
The name would typically be the Seam component name, entity class, or view ID. The action would be
the method name, the JSF phase (restore or render), or an assigned term representing the intent of
the activity. Finally, one or more contextual objects could be inserted directly into the working
memory to help make the decision, typically the target of the activity.
For example: s:hasPermission('userManager', 'edit', user)
In Seam 2.1, a permission has been simplified to just two elements:
* target
* action
In place of the nebulous name element, the target becomes the focus of the permission. The action
continues to communicate the intent of the activity being secured. Inside the rules file, most of the
checking now revolves around the target object.
For example: s:hasPermission(user, 'edit')
This change makes the rules more generally applicable. It also allows Seam to consult a persistent
permission resolver (ACL) in addition to the rule-based resolver.
Be aware that existing rules may behave oddly. That's because given the following permission check:
s:hasPermission('userManager', 'edit', user)
Seam will transpose as follows to bring it inline with the new design.
s:hasPemrission(user, 'edit')
Please read the new chapter on security for all the details about this new design.
Identity.isLoggedIn()
---------------------
This method has been modified so that it doesn't attempt to perform an authentication if credentials
have been set. Instead, it will simply return true if the user is currently authenticated. If you
require the previous behaviour, then please use Identity.tryLogin() instead.
If you are using the token-based "Remember Me" feature of Seam Security, you will need to add the following
section to components.xml to ensure that the user is automatically logged in when first accessing the
application:
PDF (iText)
--------
The documentStore component has been moved from the pdf/itext module into Seam proper. Any
references to pdf:document-store in components.xml should be replaced with document:document-store.
Similary, if you are currently referencing org.jboss.seam.pdf.DocumentStoreServlet in your web.xml,
you should now use org.jboss.seam.document.DocumentStoreServlet.
Clustering
----------
Seam's ManagedEntityInterceptor (formally ManagedEntityIdentityInterceptor) is now disabled by
default. If you need the ManagedEntityInterceptor for clustered failover of conversations, you can
enable it components.xml:
org.jboss.seam.core.SynchronizationInterceptor
org.jboss.seam.async.AsynchronousInterceptor
org.jboss.seam.ejb.RemoveInterceptor
org.jboss.seam.persistence.HibernateSessionProxyInterceptor
org.jboss.seam.persistence.EntityManagerProxyInterceptor
org.jboss.seam.core.MethodContextInterceptor
org.jboss.seam.core.EventInterceptor
org.jboss.seam.core.ConversationalInterceptor
org.jboss.seam.bpm.BusinessProcessInterceptor
org.jboss.seam.core.ConversationInterceptor
org.jboss.seam.core.BijectionInterceptor
org.jboss.seam.transaction.RollbackInterceptor
org.jboss.seam.transaction.TransactionInterceptor
org.jboss.seam.webservice.WSSecurityInterceptor
org.jboss.seam.security.SecurityInterceptor
org.jboss.seam.persistence.ManagedEntityInterceptor
Asynchronous Exception Handling
----------------------
All asynchronous invocations are now wrapped in exception handling. By default, any
exceptions which propagate out of the asynchronous call are caught and logged at
error level. The reference manual describes how to customize this behaviour.
Redeploy
--------
The org.jboss.seam.postInitialization event is no longer called on redeploy,
instead org.jboss.seam.postReInitialization is called.
Cache Support
-------------
Cache support has be rewritten to support JBoss Cache, JBoss POJO Cache, JBoss
Cache 2 and EHCache. If you are running on JBoss AS 4.2.x JBoss Cache 1.x will
be used or on JBoss 5.x JBoss Cache 2 will be installed. You can find more about
how to configure the cache provider in the reference manual.
The use is unchanged, but you can no longer inject the pojoCache
component. Instead you should configure JBoss POJO cache as your cache provider
in components.xml:
and inject it using
@In CacheProvider cacheProvider;
The CacheProvider provides a Map like interface, and the getDelegate() method
can be used to retrieve the underling cache.
Dependency changes (Maven)
--------------------------
The "provided" platform is now JBoss AS 4.2.3, therefore javasisst:javassist and
dom4j:dom4j are now marked as provided.
Seam Application Framework Changes
----------------------------------
Seam now expects value expressions for a number of properties
(entityHome.createdMessage, entityHome.updatedMessage, entityHome.deletedMessage
and entityQuery.restrictions); if you are using components.xml to configure your
objects, you don't need to make any changes. If you are extending the objects in
Java, you just need to create a value expression; for example:
public ValueExpression getCreatedMessage() {
return createValueExpression("New person #{person.firstName} #{person.lastName} created");
}