You can either turn each layer into separate projects or you can organize them simply in packages for smaller apps.
This is what your workspace might look like…
And here is some output demonstrating regular requests and request that result in Exceptions from your service layer or 3rd party api’s.
Call without exceptions
http://localhost:8080/mvc-example/layerDemoHandler
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: org.springframework.web.HttpRequestHandler.handleRequest with args [org.apache.catalina.connector.RequestFacade@50d35eb7, org.apache.catalina.connector.ResponseFacade@64ef69d5]
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.view.manager.PersonViewManager.getPerson with args [com.raulraja.dto.PersonDTO@17d1747c]
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.service.PersonBusinessService.getActivePerson with args [com.raulraja.dto.PersonDTO@17d1747c]
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.model.manager.PersonManager.find with args [1]
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.persistence.PersistenceAdapter.findById with args [class com.raulraja.model.domain.impl.Person, 1]
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: com.raulraja.model.domain.impl.Person@1
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: com.raulraja.persistence.PersistenceAdapter.findById
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: com.raulraja.model.domain.impl.Person@1
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: com.raulraja.model.manager.PersonManager.find
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: com.raulraja.model.domain.impl.Person@1
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: com.raulraja.service.PersonBusinessService.getActivePerson
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: com.raulraja.view.object.PersonVO@580d63fe
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: com.raulraja.view.manager.PersonViewManager.getPerson
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: null
06/15 10:26:34 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: org.springframework.web.HttpRequestHandler.handleRequest
Call with 3rd party runtime exceptions
06/15 10:41:51 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: org.springframework.web.HttpRequestHandler.handleRequest with args [org.apache.catalina.connector.RequestFacade@162fcc88, org.apache.catalina.connector.ResponseFacade@1c1d0019]
06/15 10:41:51 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.view.manager.PersonViewManager.getPerson with args [com.raulraja.dto.PersonDTO@398f3f27]
06/15 10:41:51 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.service.PersonBusinessService.getActivePerson with args [com.raulraja.dto.PersonDTO@398f3f27]
06/15 10:41:51 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.model.manager.PersonManager.find with args [-9999]
06/15 10:41:51 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.persistence.PersistenceAdapter.findById with args [class com.raulraja.model.domain.impl.Person, -9999]
06/15 10:41:52 ERROR com.raulraja.view.aop.ExceptionInterceptor – No row with the given identifier exists: [com.raulraja.model.domain.impl.Person#-9999]
06/15 10:41:52 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: null
06/15 10:41:52 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: org.springframework.web.HttpRequestHandler.handleRequest
Call with extensions indicating business exceptions
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: org.springframework.web.HttpRequestHandler.handleRequest with args [org.apache.catalina.connector.RequestFacade@162fcc88, org.apache.catalina.connector.ResponseFacade@1c1d0019]
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.view.manager.PersonViewManager.getPerson with args [com.raulraja.dto.PersonDTO@327b3e31]
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.service.PersonBusinessService.getActivePerson with args [com.raulraja.dto.PersonDTO@327b3e31]
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.model.manager.PersonManager.find with args [2]
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – ENTERING: com.raulraja.persistence.PersistenceAdapter.findById with args [class com.raulraja.model.domain.impl.Person, 2]
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: com.raulraja.model.domain.impl.Person@2
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: com.raulraja.persistence.PersistenceAdapter.findById
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: com.raulraja.model.domain.impl.Person@2
06/15 10:47:09 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: com.raulraja.model.manager.PersonManager.find
06/15 10:47:09 ERROR com.raulraja.view.aop.ExceptionInterceptor – com.raulraja.model.domain.impl.Person@2 is not active
06/15 10:47:13 DEBUG com.raulraja.util.aop.LayerLogInterceptor – Returning: null
06/15 10:47:13 DEBUG com.raulraja.util.aop.LayerLogInterceptor – EXITING: org.springframework.web.HttpRequestHandler.handleRequest
Pages: 1 2


Que onda, quisiera ver el ejemplo de este patron, como lo descargo?
Puedes descargarlo con:
svn export http://raulrajatutorials.googlecode.com/svn/trunk/
Ahi estan todos los tutoriales en svn.
Tambien puedes ir directamente a la direccion con tu navegador