<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4533039919307135869</id><updated>2012-01-01T20:14:54.258-08:00</updated><category term='plsql'/><category term='declaracion'/><category term='transactional'/><category term='jsf'/><category term='certificacion'/><category term='fga'/><category term='inicializacion'/><category term='java'/><category term='seam'/><category term='java basico'/><category term='spring basico'/><category term='wsit'/><category term='web'/><category term='junit'/><category term='aop'/><category term='spring web services'/><category term='spring security'/><category term='inyeccion dependencias'/><category term='preguntas y respuestas'/><category term='maven'/><category term='spring mvc'/><category term='tomcat'/><category term='hola mundo en java'/><category term='servicios web'/><category term='scdjws'/><category term='scjp'/><category term='alcance'/><category term='oracle'/><category term='oca'/><category term='arquitectura'/><category term='interface'/><category term='testng'/><category term='ejb'/><category term='spring'/><category term='auditoria'/><category term='prometric'/><category term='jboss'/><category term='interoperabilidad'/><title type='text'>El Blog de Carlitos Cacique</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-7113372638813228083</id><published>2010-08-10T19:56:00.000-07:00</published><updated>2010-08-10T20:07:34.072-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='spring security'/><title type='text'>Spring Security Mediante Base de Datos</title><content type='html'>&lt;div&gt;En el post anterior les mostré como implementar spring security de la manera más básica, ahora continuaremos pero esta vez ya no obtendremos los usuarios desde XML como en:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;security:authentication-manager alias="autenticationManagerXML"&gt;&lt;br /&gt;  &lt;security:authentication-provider&gt;&lt;br /&gt;    &lt;security:password-encoder hash="plaintext"/&gt;&lt;br /&gt; &lt;security:user-service&gt;&lt;br /&gt;   &lt;security:user name="ccacique1" password="pass1" authorities="PERFIL_ADMINISTRADOR" /&gt;&lt;br /&gt;   &lt;security:user name="ccacique2" password="pass2" authorities="PERFIL_SUPERVISOR" /&gt;&lt;br /&gt;   &lt;security:user name="ccacique3" password="pass3" authorities="PPERFIL_ADMINISTRADOR,PERFIL_SUPERVISOR" /&gt;&lt;br /&gt; &lt;/security:user-service&gt;&lt;br /&gt;  &lt;/security:authentication-provider&gt;&lt;br /&gt;&lt;/security:authentication-manager&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ahora vamos a obtener los usuarios desde un archivo de propiedades, para eso el XML anterior se reduce a:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;security:authentication-manager alias="autenticationManagerFileProperties"&gt;&lt;br /&gt;  &lt;security:authentication-provider&gt;&lt;br /&gt;     &lt;security:password-encoder hash="plaintext"/&gt;&lt;br /&gt;      &lt;security:user-service properties="classpath:/usuarios.properties"/&gt; &lt;br /&gt;  &lt;/security:authentication-provider&gt;&lt;br /&gt;&lt;/security:authentication-manager&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ojo que el archivo de propiedades lo podemos obtener desde el classpath de la aplicación(como en el ejemplo anterior) &lt;br /&gt;o desde un archivo externo a la aplicación como en:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;security:authentication-manager alias="autenticationManagerFileProperties"&gt;&lt;br /&gt;  &lt;security:authentication-provider&gt;&lt;br /&gt;     &lt;security:password-encoder hash="plaintext"/&gt;&lt;br /&gt;     &lt;security:user-service properties="file:I:\proyectos\pruebas-concepto\enelserver\usuarios.properties"/&gt;&lt;br /&gt;  &lt;/security:authentication-provider&gt;&lt;br /&gt;&lt;/security:authentication-manager&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;De esta manera podemos modificar el archivo de propiedades sin desempaquetar el EAR o WAR de la aplicación&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El archivo de propiedades que contiene a los usuarios es bien simple, le especificamos el usuario, password, los roles o perfiles y si está habilitado o no:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:text"&gt;&lt;br /&gt;#usuario=password,rol1[,rolN][,enabled|disabled]&lt;br /&gt;ccacique1=pass1,PERFIL_ADMINISTRADOR,disabled&lt;br /&gt;ccacique2=pass2,PERFIL_SUPERVISOR,enabled&lt;br /&gt;ccacique3=pass3,PERFIL_ADMINISTRADOR,PERFIL_SUPERVISOR,enabled&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;La gestión de usuarios mediante archivos(sea en XML o en properties) no es apropiado en un entorno de producción donde pueden interactuar cientos o miles de usuarios, por lo que spring security nos proporciona una manera de obtener dichos usuarios desde la base de datos:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Para implementar la gestión de usuarios mediante una base de datos con spring security debemos de hacer lo siguiente:&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Implementar un proveedor de usuarios.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;El proveedor de usuarios debe de implementar la interface &lt;b&gt;org.springframework.security.core.userdetails.UserDetailsService&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;La interface anterior obliga a definir el método &lt;b&gt;public UserDetails loadUserByUsername(String username), por lo que debemos de implementarlo&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;El método anterior retorna un objeto de la clase &lt;b&gt;org.springframework.security.core.userdetails.UserDetails&lt;/b&gt;, esta clase define campos de autenticación de usuarios simple como nombre de usuario, password, si el usuario está bloqueado y los perfiles asociados a este usuario.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Colocar la referencia al proveedor de usuarios en &lt;security:authentication-provider user-service-ref="usuarioService"&gt; donde usuarioService es mi proveedor de usuarios&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Veamos la implementación del gestor de usuarios:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.pc.springsecurity.service.impl;&lt;br /&gt;import java.util.List;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;import org.springframework.dao.DataAccessException;&lt;br /&gt;import org.springframework.security.core.userdetails.UserDetails;&lt;br /&gt;import org.springframework.security.core.userdetails.UserDetailsService;&lt;br /&gt;import org.springframework.security.core.userdetails.UsernameNotFoundException;&lt;br /&gt;import org.springframework.stereotype.Service;&lt;br /&gt;import pe.com.slcsccy.pc.springsecurity.dao.UsuarioDAO;&lt;br /&gt;import pe.com.slcsccy.pc.springsecurity.model.Usuario;&lt;br /&gt;&lt;br /&gt;@Service("usuarioService")&lt;br /&gt;public class UsuarioServiceImpl implements UserDetailsService{&lt;br /&gt; @Autowired&lt;br /&gt; private UsuarioDAO usuarioDAO;&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; public UserDetails loadUserByUsername(String username)&lt;br /&gt;   throws UsernameNotFoundException, DataAccessException {&lt;br /&gt;  Usuario usuario = null;&lt;br /&gt;  List&lt;Usuario&gt; usuarios = usuarioDAO.buscarUsuarioPorCodigo(username);&lt;br /&gt;  if(usuarios.size()==0)throw new UsernameNotFoundException("Usuario no existe.");&lt;br /&gt;  else{&lt;br /&gt;   usuario = usuarios.get(0);&lt;br /&gt;   usuario.setPerfiles(usuarioDAO.buscarPerfilesDeUsuarioPorCodigo(username));&lt;br /&gt;   return usuario; &lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El proveedor de usuarios hace uso de un objeto de acceso a datos, que lo he implementado con spring jdbc:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.pc.springsecurity.dao;&lt;br /&gt;import java.sql.ResultSet;&lt;br /&gt;import java.sql.SQLException;&lt;br /&gt;import java.util.List;&lt;br /&gt;import javax.sql.DataSource;&lt;br /&gt;import org.springframework.jdbc.core.JdbcTemplate;&lt;br /&gt;import org.springframework.jdbc.core.RowMapper;&lt;br /&gt;import org.springframework.security.core.GrantedAuthority;&lt;br /&gt;&lt;br /&gt;import pe.com.slcsccy.pc.springsecurity.model.Perfil;&lt;br /&gt;import pe.com.slcsccy.pc.springsecurity.model.Usuario;&lt;br /&gt;&lt;br /&gt;public class UsuarioDAOImpl implements UsuarioDAO {&lt;br /&gt;&lt;br /&gt; private JdbcTemplate jdbcTemplate;&lt;br /&gt;&lt;br /&gt; public void setDataSource(DataSource dataSource) {&lt;br /&gt;  this.jdbcTemplate = new JdbcTemplate(dataSource);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public List&lt;Usuario&gt; buscarUsuarioPorCodigo(String codigo) {&lt;br /&gt;  return jdbcTemplate.query("select * from usuario where cod_usuario = ? ", new RowMapper() {&lt;br /&gt;   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {&lt;br /&gt;    Usuario usuario = new Usuario();&lt;br /&gt;    usuario.setUsername(rs.getString("cod_usuario"));&lt;br /&gt;    usuario.setPassword(rs.getString("des_password"));&lt;br /&gt;    usuario.setAccountNonExpired(rs.getString("in_cuenta_expirada").equals("N")?true:false);&lt;br /&gt;    usuario.setAccountNonLocked(rs.getString("in_cuenta_bloqueada").equals("N")?true:false);&lt;br /&gt;    usuario.setCredentialsNonExpired(rs.getString("in_credencial_expirada").equals("N")?true:false);&lt;br /&gt;    usuario.setEnabled(rs.getString("in_habilitado").equals("S")?true:false);&lt;br /&gt;    return usuario;&lt;br /&gt;   }&lt;br /&gt;  },codigo);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public List&lt;? extends GrantedAuthority&gt; buscarPerfilesDeUsuarioPorCodigo(String codigo) {&lt;br /&gt;  return jdbcTemplate.query("select cod_perfil from usuario_perfil where cod_usuario = ? ", new RowMapper() {&lt;br /&gt;   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {&lt;br /&gt;    Perfil perfil = new Perfil();&lt;br /&gt;    perfil.setNombrePerfil(rs.getString("cod_perfil"));&lt;br /&gt;    return perfil;&lt;br /&gt;   }&lt;br /&gt;  },codigo);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El acceso a los datos se realiza mediante un modelo de dominio de usuarios y de perfiles siguiente:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Usuario.java&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.pc.springsecurity.model;&lt;br /&gt;import java.util.Collection;&lt;br /&gt;import java.util.List;&lt;br /&gt;import org.springframework.security.core.GrantedAuthority;&lt;br /&gt;import org.springframework.security.core.userdetails.UserDetails;&lt;br /&gt;public class Usuario implements UserDetails{&lt;br /&gt;&lt;br /&gt; private static final long serialVersionUID = -4993799715730712001L;&lt;br /&gt; &lt;br /&gt; private List&lt;GrantedAuthority&gt; perfiles;&lt;br /&gt; private String username;&lt;br /&gt; private String password;&lt;br /&gt; private boolean accountNonExpired;&lt;br /&gt; private boolean accountNonLocked;&lt;br /&gt; private boolean credentialsNonExpired;&lt;br /&gt; private boolean enabled;&lt;br /&gt; &lt;br /&gt; public Collection&lt;? extends GrantedAuthority&gt; getPerfiles() {&lt;br /&gt;  return perfiles;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; public void setPerfiles(List&lt;? extends GrantedAuthority&gt; perfiles) {&lt;br /&gt;  this.perfiles = (List&lt;GrantedAuthority&gt;) perfiles;&lt;br /&gt; }&lt;br /&gt; public String getUsername() {&lt;br /&gt;  return username;&lt;br /&gt; }&lt;br /&gt; public void setUsername(String username) {&lt;br /&gt;  this.username = username;&lt;br /&gt; }&lt;br /&gt; public String getPassword() {&lt;br /&gt;  return password;&lt;br /&gt; }&lt;br /&gt; public void setPassword(String password) {&lt;br /&gt;  this.password = password;&lt;br /&gt; }&lt;br /&gt; public boolean isAccountNonExpired() {&lt;br /&gt;  return accountNonExpired;&lt;br /&gt; }&lt;br /&gt; public void setAccountNonExpired(boolean accountNonExpired) {&lt;br /&gt;  this.accountNonExpired = accountNonExpired;&lt;br /&gt; }&lt;br /&gt; public boolean isAccountNonLocked() {&lt;br /&gt;  return accountNonLocked;&lt;br /&gt; }&lt;br /&gt; public void setAccountNonLocked(boolean accountNonLocked) {&lt;br /&gt;  this.accountNonLocked = accountNonLocked;&lt;br /&gt; }&lt;br /&gt; public boolean isCredentialsNonExpired() {&lt;br /&gt;  return credentialsNonExpired;&lt;br /&gt; }&lt;br /&gt; public void setCredentialsNonExpired(boolean credentialsNonExpired) {&lt;br /&gt;  this.credentialsNonExpired = credentialsNonExpired;&lt;br /&gt; }&lt;br /&gt; public boolean isEnabled() {&lt;br /&gt;  return enabled;&lt;br /&gt; }&lt;br /&gt; public void setEnabled(boolean enabled) {&lt;br /&gt;  this.enabled = enabled;&lt;br /&gt; }&lt;br /&gt; public Collection&lt;GrantedAuthority&gt; getAuthorities() {&lt;br /&gt;  return perfiles;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Perfil.java&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.pc.springsecurity.model;&lt;br /&gt;import org.springframework.security.core.GrantedAuthority;&lt;br /&gt;public class Perfil implements GrantedAuthority{&lt;br /&gt;&lt;br /&gt; private static final long serialVersionUID = 1L;&lt;br /&gt; private String nombrePerfil;&lt;br /&gt; &lt;br /&gt; public Perfil(){&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public String getNombrePerfil() {&lt;br /&gt;  return nombrePerfil;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setNombrePerfil(String nombrePerfil) {&lt;br /&gt;  this.nombrePerfil = nombrePerfil;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public String getAuthority() {&lt;br /&gt;  return this.nombrePerfil;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El modelo de dominio y el objeto de acceso a datos colaboran entre sí para conectarse y dar soporte a los datos de una base de datos Oracle que tiene la siguiente estructura e información:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;create user springsecurity identified by springsecurity account unlock;&lt;br /&gt;grant resource,connect to springsecurity;&lt;br /&gt;&lt;br /&gt;create table springsecurity.usuario(&lt;br /&gt;  cod_usuario varchar2(40) not null,&lt;br /&gt;  des_password varchar2(40) not null,&lt;br /&gt;  in_cuenta_expirada char(1) default 'N' not null ,&lt;br /&gt;  in_cuenta_bloqueada char(1) default 'N' not null ,&lt;br /&gt;  in_credencial_expirada char(1) default 'N' not null ,&lt;br /&gt;  in_habilitado char(1) default 'S' not null ,&lt;br /&gt;  primary key(cod_usuario)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;create table springsecurity.perfil(&lt;br /&gt;  cod_perfil varchar2(40) not null,&lt;br /&gt;  des_perfil varchar2(40) not null,&lt;br /&gt;  primary key(cod_perfil)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;create table springsecurity.usuario_perfil(&lt;br /&gt;  cod_usuario varchar2(40),&lt;br /&gt;  cod_perfil varchar2(40),&lt;br /&gt;  primary key(cod_usuario,cod_perfil),&lt;br /&gt;  foreign key(cod_usuario) references springsecurity.usuario(cod_usuario),&lt;br /&gt;  foreign key(cod_perfil) references springsecurity.perfil(cod_perfil)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;insert into springsecurity.perfil values('PERFIL_ADMINISTRADOR','PERFIL DE ADMINISTRADOR');&lt;br /&gt;insert into springsecurity.perfil values('PERFIL_SUPERVISOR','PERFIL DE SUPERVISOR');&lt;br /&gt;insert into springsecurity.usuario(cod_usuario,des_password) values('ccacique1','pass1');&lt;br /&gt;insert into springsecurity.usuario(cod_usuario,des_password) values('ccacique2','pass2');&lt;br /&gt;insert into springsecurity.usuario(cod_usuario,des_password) values('ccacique3','pass3');&lt;br /&gt;insert into springsecurity.usuario(cod_usuario,des_password) values('ccacique4','pass4');&lt;br /&gt;insert into springsecurity.usuario_perfil(cod_usuario,cod_perfil) values('ccacique1','PERFIL_ADMINISTRADOR');&lt;br /&gt;insert into springsecurity.usuario_perfil(cod_usuario,cod_perfil) values('ccacique2','PERFIL_SUPERVISOR');&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Con la estructura anterior ya podemos gestionar nuestros usuarios con soporte de spring security.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El contenedor de beans de spring security quedaría de la siguiente manera:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;b:beans xmlns:security="http://www.springframework.org/schema/security"&lt;br /&gt; xmlns:b="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"&gt;&lt;br /&gt;&lt;br /&gt; &lt;!--&lt;br /&gt;  [security:http]: Elemento para configurar la seguridad de la&lt;br /&gt;  aplicación web por medio del protocolo http. Tiene los siguientes&lt;br /&gt;  atributos: [realm]: Atributo opcional que especifica el nombre del&lt;br /&gt;  alcance que será usado para todas las caracteristicas de seguridad que&lt;br /&gt;  requieren un nombre de alcance(por ejemplo autenticación BASIC y&lt;br /&gt;  DIGEST). [auto-config]: Automáticamente registra un formulario de&lt;br /&gt;  registro, autenticaciòn BASIC, autenticación anónima, servicios de&lt;br /&gt;  cierre de sesion, opción de recordación de usuario, si es colocado a&lt;br /&gt;  'true' todas estas caracteristicas serán configuradas, pero cualquier&lt;br /&gt;  caracteristica puede sobreescribirse especificando mediante XML dichos&lt;br /&gt;  elementos.&lt;br /&gt; --&gt;&lt;br /&gt; &lt;security:http realm="Calculadora Realm" auto-config="true"&lt;br /&gt;  access-decision-manager-ref="accessDecisionManager"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!--&lt;br /&gt;   Especifica el patrón URL y el tipo de acceso de cada interceptor&lt;br /&gt;   Posibles valores para los tipos de acceso si no se a especificado un&lt;br /&gt;   perfil de autenticación:&lt;br /&gt;   org.springframework.security.access.vote.AuthenticatedVoter.IS_AUTHENTICATED_FULLY&lt;br /&gt;   org.springframework.security.access.vote.AuthenticatedVoter.IS_AUTHENTICATED_REMEMBERED&lt;br /&gt;   org.springframework.security.access.vote.AuthenticatedVoter.IS_AUTHENTICATED_ANONYMOUSLY&lt;br /&gt;  --&gt;&lt;br /&gt;  &lt;security:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /&gt;&lt;br /&gt;  &lt;security:intercept-url pattern="/private/super/**" access="PERFIL_SUPERVISOR" /&gt;&lt;br /&gt;  &lt;security:intercept-url pattern="/private/admin/**" access="PERFIL_ADMINISTRADOR" /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!--&lt;br /&gt;   Especifica el proceso de autenticación mediante un formulario:&lt;br /&gt;   [login-page]: URL del formulario de autenticación.&lt;br /&gt;   [authentication-failure-url]: URL de la página en caso la autenticación falle. &lt;br /&gt;   [login-processing-url]: URL hacia el cual la autenticación será procesada. &lt;br /&gt;   [default-target-url]: URL hacia el cual se redirigirá el control luego de un login exitoso  &lt;br /&gt;  --&gt;&lt;br /&gt;  &lt;security:form-login &lt;br /&gt;   login-page="/login.jsp" &lt;br /&gt;   default-target-url="/public/mostrarFormulario.htm" &lt;br /&gt;   authentication-failure-url="/loginerror.jsp"/&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!--  Especifica el tipo de autenticación:--&gt;&lt;br /&gt;  &lt;security:http-basic /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!--&lt;br /&gt;   Especifica el tratamiento para los fines de sesión o logouts:&lt;br /&gt;   [invalidate-session]: Si el proceso de logout debe de terminar la sesión(default=true) &lt;br /&gt;   [logout-url]: URL que determina el fin de sesión. &lt;br /&gt;   [logout-success-url]: URL del recurso que será mostrado una vez terminada la sesión.&lt;br /&gt;  --&gt;&lt;br /&gt;  &lt;security:logout &lt;br /&gt;   invalidate-session="true" &lt;br /&gt;   logout-url="/public/terminarSesion.htm"&lt;br /&gt;   logout-success-url="/logout.jsp"  /&gt;&lt;br /&gt;  &lt;security:remember-me/&gt;&lt;br /&gt; &lt;/security:http&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- &lt;security:authentication-manager&gt;: Gestor de autenticacion, necesita un proveedor de autenticación &lt;br /&gt;   sea mediante LDAP(&lt;security:ldap-authentication-provider&gt;) o normal(&lt;security:authentication-provider&gt;),&lt;br /&gt;   si el proveedor de autenticación es normal entonces podemos colocar un codificador de passwords &lt;br /&gt;   &lt;security:password-encoder&gt; el cual soporta los algoritmos hash md4,md5 y sha, por default ningún algoritmo&lt;br /&gt;   es asignado por lo que la autenticación se procesa mediante texto plano, tambien podemos indicar si queremos&lt;br /&gt;   soporte de codificación en base64(por default es sí). Al proveedor de autenticación le podemos asignar los&lt;br /&gt;   password mediante formato xml de la siguiente forma:&lt;br /&gt;    &lt;security:user-service&gt;&lt;br /&gt;     &lt;security:user name="ccacique1" password="pass1" authorities="PERFIL_ADMINISTRADOR" /&gt;&lt;br /&gt;    &lt;security:user-service&gt; &lt;br /&gt;   o podemos hacerlo mediante un bean que implemente la interface &lt;br /&gt;   org.springframework.security.core.userdetails.UserDetailsService&lt;br /&gt;   &lt;security:authentication-provider user-service-ref="UserDetailsServiceImpl"&gt; la interface anterior&lt;br /&gt;   define un método para cargar un usuario dado su código de usuario:&lt;br /&gt;   UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException;&lt;br /&gt;   --&gt;&lt;br /&gt;    &lt;!-- Gestión de usuario mediante XML: --&gt;&lt;br /&gt;    &lt;!-- &lt;br /&gt; &lt;security:authentication-manager alias="autenticationManagerXML"&gt;&lt;br /&gt;  &lt;security:authentication-provider&gt;&lt;br /&gt;   &lt;security:password-encoder hash="plaintext"/&gt;&lt;br /&gt;   &lt;security:user-service&gt;&lt;br /&gt;    &lt;security:user name="ccacique1" password="pass1" authorities="PERFIL_ADMINISTRADOR" /&gt;&lt;br /&gt;    &lt;security:user name="ccacique2" password="pass2" authorities="PERFIL_SUPERVISOR" /&gt;&lt;br /&gt;    &lt;security:user name="ccacique3" password="pass3" authorities="PPERFIL_ADMINISTRADOR,PERFIL_SUPERVISOR" /&gt;&lt;br /&gt;   &lt;/security:user-service&gt;&lt;br /&gt;  &lt;/security:authentication-provider&gt;&lt;br /&gt; &lt;/security:authentication-manager&gt;&lt;br /&gt; --&gt;&lt;br /&gt; &lt;br /&gt; &lt;!-- &lt;br /&gt; Gestión de usuarios mediante un archivo de propiedades, este archivo de propiedades puede&lt;br /&gt; estar en el classpath o en una carpeta en el servidor.&lt;br /&gt; Si el archivo de propiedades está en el classpath de la aplicación:&lt;br /&gt; &lt;security:user-service properties="classpath:/usuarios.properties"/&gt;&lt;br /&gt; Si el archivo de propiedades está en una ruta en el servidor:&lt;br /&gt; &lt;security:user-service properties="file:I:\proyectos\pruebas-concepto\enelserver\usuarios.properties"/&gt; &lt;br /&gt; --&gt;&lt;br /&gt; &lt;!-- &lt;br /&gt; &lt;security:authentication-manager alias="autenticationManagerFileProperties"&gt;&lt;br /&gt;  &lt;security:authentication-provider&gt;&lt;br /&gt;   &lt;security:password-encoder hash="plaintext"/&gt;&lt;br /&gt;   &lt;security:user-service properties="classpath:/usuarios.properties"/&gt; &lt;br /&gt;  &lt;/security:authentication-provider&gt;&lt;br /&gt; &lt;/security:authentication-manager&gt;&lt;br /&gt;  --&gt;&lt;br /&gt; &lt;br /&gt; &lt;!-- Gestión de usuarios mediante un proveedor de servicios de usuarios: --&gt;&lt;br /&gt; &lt;security:authentication-manager alias="autenticationManagerUserService"&gt;&lt;br /&gt;  &lt;security:authentication-provider user-service-ref="usuarioService"&gt;&lt;br /&gt;   &lt;security:password-encoder hash="plaintext"/&gt;&lt;br /&gt;  &lt;/security:authentication-provider&gt;&lt;br /&gt; &lt;/security:authentication-manager&gt;  &lt;br /&gt;&lt;br /&gt; &lt;!-- Creo mi proveedor de usuarios --&gt;&lt;br /&gt; &lt;!-- &lt;b:bean id="usuarioServiceImpl" class="pe.com.slcsccy.pc.springsecurity.service.impl.UsuarioServiceImpl"/&gt;  --&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Configura el gestor de decisiones de autenticación. --&gt;&lt;br /&gt; &lt;b:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"&gt;&lt;br /&gt;  &lt;!-- Define los participantes en el proceso de autenticación: --&gt;&lt;br /&gt;  &lt;b:property name="decisionVoters"&gt;&lt;br /&gt;   &lt;b:list&gt;&lt;br /&gt;    &lt;b:ref bean="decisorDeRoles" /&gt;&lt;br /&gt;    &lt;b:ref bean="decisorDeAutenticacion" /&gt;&lt;br /&gt;   &lt;/b:list&gt;&lt;br /&gt;  &lt;/b:property&gt;&lt;br /&gt; &lt;/b:bean&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Decisor de roles, necesario para tener nombres de roles personalizados --&gt;&lt;br /&gt; &lt;b:bean id="decisorDeRoles" class="org.springframework.security.access.vote.RoleVoter"&gt;&lt;br /&gt;  &lt;b:property name="rolePrefix" value="PERFIL_" /&gt;&lt;br /&gt; &lt;/b:bean&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Decisor de autenticación. --&gt;&lt;br /&gt; &lt;b:bean id="decisorDeAutenticacion" class="org.springframework.security.access.vote.AuthenticatedVoter"/&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Automatically receives AuthenticationEvent messages --&gt;&lt;br /&gt; &lt;b:bean id="loggerListener" class="org.springframework.security.authentication.event.LoggerListener" /&gt;&lt;br /&gt;&lt;/b:beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El proyecto completo te lo puedes bajar desde &lt;a href="https://sites.google.com/site/carloscacique/springsecurity2.7z?attredirects=0&amp;d=1"&gt;AQUI&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-7113372638813228083?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/7113372638813228083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/08/spring-security-mediante-base-de-datos.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/7113372638813228083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/7113372638813228083'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/08/spring-security-mediante-base-de-datos.html' title='Spring Security Mediante Base de Datos'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-7456218676092362297</id><published>2010-08-07T11:24:00.000-07:00</published><updated>2010-08-10T19:56:51.777-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='spring security'/><title type='text'>Spring Security Mediante XML</title><content type='html'>&lt;div&gt;Hola que tal, ahora les voy a presentar una pequeña implementación de spring security, el caso de uso a implementar es el siguiente:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Permitir que la aplicación calculadora(formulario simple de ingreso de operandos y selección de operación) sea accedida mediante usuarios que previamente se han autenticado o que tambien sea accedida en forma anónima al seleccionar una lista de opciones.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;1. Lo primero que tenemos que hacer es configurar un filtro en el descriptor de despliegue de nuestra aplicación web de la siguiente manera:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Declaracion del servlet de spring controller--&gt;&lt;br /&gt; &lt;servlet&gt;&lt;br /&gt;  &lt;servlet-name&gt;calculadora-controller&lt;/servlet-name&gt;&lt;br /&gt;  &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;&lt;br /&gt;  &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;&lt;br /&gt; &lt;/servlet&gt;&lt;br /&gt; &lt;br /&gt; &lt;!-- Mapping del servlet de spring controller, según el &lt;url-pattern&gt; todos las &lt;br /&gt; URLs que terminen en .htm serán afectadas por este controller --&gt;&lt;br /&gt; &lt;servlet-mapping&gt;&lt;br /&gt;  &lt;servlet-name&gt;calculadora-controller&lt;/servlet-name&gt;&lt;br /&gt;  &lt;url-pattern&gt;*.htm&lt;/url-pattern&gt;&lt;br /&gt; &lt;/servlet-mapping&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Un paso importante para configurar spring security es definir el filtro&lt;br /&gt; por el que pasarán las solicitudes --&gt;&lt;br /&gt; &lt;filter&gt;&lt;br /&gt;  &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;&lt;br /&gt;  &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;&lt;br /&gt; &lt;/filter&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Mapping del filtro que captura todas las solicitudes, si queremos que spring security solo&lt;br /&gt; afecte a ciertas partes de la aplicación unicamente modificamos el &lt;url-pattern&gt; --&gt;&lt;br /&gt; &lt;filter-mapping&gt;&lt;br /&gt;  &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;&lt;br /&gt;  &lt;url-pattern&gt;/*&lt;/url-pattern&gt;&lt;br /&gt; &lt;/filter-mapping&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Listener que carga el contexto de beans de spring security--&gt;&lt;br /&gt; &lt;listener&gt;&lt;br /&gt;  &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;&lt;br /&gt; &lt;/listener&gt;&lt;br /&gt; &lt;br /&gt; &lt;!-- Parámetro contextual(A nivel de aplicación) que define la ruta física del contenedor de beans  --&gt;&lt;br /&gt; &lt;context-param&gt;&lt;br /&gt;  &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;&lt;br /&gt;  &lt;param-value&gt;&lt;br /&gt;  /WEB-INF/calculadora-security.xml &lt;/param-value&gt;&lt;br /&gt; &lt;/context-param&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Archivos de bienvenida --&gt;&lt;br /&gt; &lt;welcome-file-list&gt;&lt;br /&gt;  &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;&lt;br /&gt; &lt;/welcome-file-list&gt;&lt;br /&gt; &lt;br /&gt; &lt;!-- Página de error, indicando un acceso denegado. --&gt;&lt;br /&gt; &lt;error-page&gt;&lt;br /&gt;        &lt;error-code&gt;403&lt;/error-code&gt;&lt;br /&gt;        &lt;location&gt;/sinacceso.jsp&lt;/location&gt;&lt;br /&gt;    &lt;/error-page&gt;&lt;br /&gt;&lt;br /&gt;&lt;/web-app&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;2. Ahora vamos a configurar los beans que conforman el controller de la aplicación, mediante anotaciones. El flujo de control de la aplicación es simple: define un archivo de inicio index.jsp que redirecciona hacia /public/iniciar.htm está ruta será interceptada por el filtro de spring security y como la URL es pública no necesitará de una autenticación, después llegará hacia el controller: @Controller public class CalculadoraController {...} que ha mapeado la URL solicitada y la redirigirá hacia la página jsp opciones.jsp. En la página de opciones es donde se prueba la seguridad implementanda mediante spring, en esta página listo 5 opciones de acceso(todas me conducen al formulario de la calculadora), la primera opción accesa al formulario en forma anónima, las 4 siguientes requieren una autenticación, si el usuario aún no se a autenticado es redirigido hacia login.jsp para que se autentique, si el usuario ingresa sus credenciales(usuario y passwords) y genera un error entonces es redirigido hacia loginerror.jsp, si el usuario se autentica satisfactoriamente pero no tiene permiso entonces generará un error 403(acceso denegado, el cual es definido en el descriptor de despliegue)&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;       xmlns:p="http://www.springframework.org/schema/p"&lt;br /&gt;       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;       xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;       xmlns:security="http://www.springframework.org/schema/security"&lt;br /&gt;       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;context:component-scan base-package="pe.com.slcsccy.pc.springsecurity.controller"/&gt;&lt;br /&gt;    &lt;context:component-scan base-package="pe.com.slcsccy.pc.springsecurity.service"/&gt;&lt;br /&gt;    &lt;context:annotation-config /&gt;&lt;br /&gt;&lt;br /&gt; &lt;bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&lt;br /&gt; p:basename="mensajes"/&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&lt;br /&gt;    p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/&gt;&lt;br /&gt; &lt;br /&gt;    &lt;bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/&gt;&lt;br /&gt;    &lt;br /&gt;&lt;/beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;3. Ahora lo más importante, la definición del contexto de seguridad mediante spring:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;b:beans xmlns:security="http://www.springframework.org/schema/security"&lt;br /&gt; xmlns:b="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"&gt;&lt;br /&gt;&lt;br /&gt; &lt;!--&lt;br /&gt;  [security:http]: Elemento para configurar la seguridad de la&lt;br /&gt;  aplicación web por medio del protocolo http. Tiene los siguientes&lt;br /&gt;  atributos: [realm]: Atributo opcional que especifica el nombre del&lt;br /&gt;  alcance que será usado para todas las caracteristicas de seguridad que&lt;br /&gt;  requieren un nombre de alcance(por ejemplo autenticación BASIC y&lt;br /&gt;  DIGEST). [auto-config]: Automáticamente registra un formulario de&lt;br /&gt;  registro, autenticaciòn BASIC, autenticación anónima, servicios de&lt;br /&gt;  cierre de sesion, opción de recordación de usuario, si es colocado a&lt;br /&gt;  'true' todas estas caracteristicas serán configuradas, pero cualquier&lt;br /&gt;  caracteristica puede sobreescribirse especificando mediante XML dichos&lt;br /&gt;  elementos.&lt;br /&gt; --&gt;&lt;br /&gt; &lt;security:http realm="Calculadora Realm" auto-config="true"&lt;br /&gt;  access-decision-manager-ref="accessDecisionManager"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!--&lt;br /&gt;   Especifica el patrón URL y el tipo de acceso de cada interceptor&lt;br /&gt;   Posibles valores para los tipos de acceso si no se a especificado un&lt;br /&gt;   perfil de autenticación:&lt;br /&gt;   org.springframework.security.access.vote.AuthenticatedVoter.IS_AUTHENTICATED_FULLY&lt;br /&gt;   org.springframework.security.access.vote.AuthenticatedVoter.IS_AUTHENTICATED_REMEMBERED&lt;br /&gt;   org.springframework.security.access.vote.AuthenticatedVoter.IS_AUTHENTICATED_ANONYMOUSLY&lt;br /&gt;  --&gt;&lt;br /&gt;  &lt;security:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /&gt;&lt;br /&gt;  &lt;security:intercept-url pattern="/private/super/**" access="PERFIL_SUPERVISOR" /&gt;&lt;br /&gt;  &lt;security:intercept-url pattern="/private/admin/**" access="PERFIL_ADMINISTRADOR" /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!--&lt;br /&gt;   Especifica el proceso de autenticación mediante un formulario:&lt;br /&gt;   [login-page]: URL del formulario de autenticación.&lt;br /&gt;   [authentication-failure-url]: URL de la página en caso la autenticación falle. &lt;br /&gt;   [login-processing-url]: URL hacia el cual la autenticación será procesada. &lt;br /&gt;   [default-target-url]: URL hacia el cual se redirigirá el control luego de un login exitoso  &lt;br /&gt;  --&gt;&lt;br /&gt;  &lt;security:form-login&lt;br /&gt;   login-page="/login.jsp" &lt;br /&gt;   default-target-url="/public/mostrarFormulario.htm" &lt;br /&gt;   authentication-failure-url="/loginerror.jsp"/&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!--  Especifica el tipo de autenticación:--&gt;&lt;br /&gt;  &lt;security:http-basic /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!--&lt;br /&gt;   Especifica el tratamiento para los fines de sesión o logouts:&lt;br /&gt;   [invalidate-session]: Si el proceso de logout debe de terminar la sesión(default=true) &lt;br /&gt;   [logout-url]: URL que determina el fin de sesión. &lt;br /&gt;   [logout-success-url]: URL del recurso que será mostrado una vez terminada la sesión.&lt;br /&gt;  --&gt;&lt;br /&gt;  &lt;security:logout &lt;br /&gt;   invalidate-session="true" &lt;br /&gt;   logout-url="/public/terminarSesion.htm"&lt;br /&gt;   logout-success-url="/logout.jsp"  /&gt;&lt;br /&gt;  &lt;security:remember-me/&gt;&lt;br /&gt; &lt;/security:http&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- &lt;security:authentication-manager&gt;: Gestor de autenticacion, necesita un proveedor de autenticación &lt;br /&gt;   sea mediante LDAP(&lt;security:ldap-authentication-provider&gt;) o normal(&lt;security:authentication-provider&gt;),&lt;br /&gt;   si el proveedor de autenticación es normal entonces podemos colocar un codificador de passwords &lt;br /&gt;   &lt;security:password-encoder&gt; el cual soporta los algoritmos hash md4,md5 y sha, por default ningún algoritmo&lt;br /&gt;   es asignado por lo que la autenticación se procesa mediante texto plano, tambien podemos indicar si queremos&lt;br /&gt;   soporte de codificación en base64(por default es sí). Al proveedor de autenticación le podemos asignar los&lt;br /&gt;   password mediante formato xml de la siguiente forma:&lt;br /&gt;    &lt;security:user-service&gt;&lt;br /&gt;     &lt;security:user name="ccacique1" password="pass1" authorities="PERFIL_ADMINISTRADOR" /&gt;&lt;br /&gt;    &lt;security:user-service&gt; &lt;br /&gt;   o podemos hacerlo mediante un bean que implemente la interface &lt;br /&gt;   org.springframework.security.core.userdetails.UserDetailsService&lt;br /&gt;   &lt;security:authentication-provider user-service-ref="UserDetailsServiceImpl"&gt; la interface anterior&lt;br /&gt;   define un método para cargar un usuario dado su código de usuario:&lt;br /&gt;   UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException;&lt;br /&gt;   --&gt;&lt;br /&gt; &lt;security:authentication-manager&gt;&lt;br /&gt;  &lt;security:authentication-provider user-service-ref=""&gt;&lt;br /&gt;   &lt;security:password-encoder hash="plaintext"/&gt;&lt;br /&gt;   &lt;security:user-service&gt;&lt;br /&gt;    &lt;!-- Lista de usuarios, nombres, password(plaintext) y sus roles asignados --&gt;&lt;br /&gt;    &lt;security:user name="ccacique1" password="pass1" authorities="PERFIL_ADMINISTRADOR" /&gt;&lt;br /&gt;    &lt;security:user name="ccacique2" password="pass2" authorities="PERFIL_SUPERVISOR" /&gt;&lt;br /&gt;    &lt;security:user name="ccacique3" password="pass3" authorities="PPERFIL_ADMINISTRADOR,PERFIL_SUPERVISOR" /&gt;&lt;br /&gt;   &lt;/security:user-service&gt;&lt;br /&gt;  &lt;/security:authentication-provider&gt;&lt;br /&gt; &lt;/security:authentication-manager&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Configura el gestor de decisiones de autenticación. --&gt;&lt;br /&gt; &lt;b:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"&gt;&lt;br /&gt;  &lt;!-- Define los participantes en el proceso de autenticación: --&gt;&lt;br /&gt;  &lt;b:property name="decisionVoters"&gt;&lt;br /&gt;   &lt;b:list&gt;&lt;br /&gt;    &lt;b:ref bean="decisorDeRoles" /&gt;&lt;br /&gt;    &lt;b:ref bean="decisorDeAutenticacion" /&gt;&lt;br /&gt;   &lt;/b:list&gt;&lt;br /&gt;  &lt;/b:property&gt;&lt;br /&gt; &lt;/b:bean&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Decisor de roles, necesario para tener nombres de roles personalizados --&gt;&lt;br /&gt; &lt;b:bean id="decisorDeRoles" class="org.springframework.security.access.vote.RoleVoter"&gt;&lt;br /&gt;  &lt;b:property name="rolePrefix" value="PERFIL_" /&gt;&lt;br /&gt; &lt;/b:bean&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Decisor de autenticación. --&gt;&lt;br /&gt; &lt;b:bean id="decisorDeAutenticacion" class="org.springframework.security.access.vote.AuthenticatedVoter"/&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Automatically receives AuthenticationEvent messages --&gt;&lt;br /&gt; &lt;b:bean id="loggerListener" class="org.springframework.security.authentication.event.LoggerListener" /&gt;&lt;br /&gt;&lt;/b:beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El proyecto completo te lo puedes bajar desde &lt;a href="https://sites.google.com/site/carloscacique/springsecurity.7z?attredirects=0&amp;d=1"&gt;AQUI&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-7456218676092362297?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/7456218676092362297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/08/spring-security-basico-mediante-xml-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/7456218676092362297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/7456218676092362297'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/08/spring-security-basico-mediante-xml-1.html' title='Spring Security Mediante XML'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-7296675852438799914</id><published>2010-07-27T20:58:00.000-07:00</published><updated>2010-07-28T13:31:23.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring web services'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring Web Services y MTOM Parte 2</title><content type='html'>&lt;div&gt;Continuando con el post anterior ahora les voy a presentar el cliente del servicio web implementando mediante saaj y axiom integrado a spring. Veamos:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;El cliente se despliega de la siguiente manera:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;1. Maven ejecuta la clase principal CalculadoraClientWebServiceZip mediante un plugin:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;plugin&gt;&lt;br /&gt;  &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;&lt;br /&gt;  &lt;artifactId&gt;exec-maven-plugin&lt;/artifactId&gt; &lt;br /&gt;  &lt;version&gt;1.1.1&lt;/version&gt;&lt;br /&gt;  &lt;executions&gt;&lt;br /&gt;    &lt;execution&gt;&lt;br /&gt;      &lt;goals&gt;&lt;br /&gt;        &lt;goal&gt;java&lt;/goal&gt;&lt;br /&gt;      &lt;/goals&gt;&lt;br /&gt;    &lt;/execution&gt;&lt;br /&gt;  &lt;/executions&gt;&lt;br /&gt;  &lt;configuration&gt;&lt;br /&gt;    &lt;mainClass&gt;pe.com.slcsccy.pc.springws.client.CalculadoraClientWebServiceZip&lt;/mainClass&gt;&lt;br /&gt;  &lt;/configuration&gt;&lt;br /&gt;&lt;/plugin&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;2. La clase CalculadoraClientWebServiceZip crea los beans que se conectaran con el web service, este contenedor de beans se llama applicationContextZip.xml:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- A tener en cuenta: &lt;br /&gt;   SAAJ: Acrónimo de 'SOAP with Attachments Api for Java', especificación que permite enviar documentos&lt;br /&gt;   XML a través de los web services.&lt;br /&gt;   MTOM: Acrónimo de 'Message Transmision Optimization Mechanism', es un mecanismo que permite enviar datos&lt;br /&gt;   binarios a través de los web services en forma eficiente. La eficiencia reside en que MTOM solo se refiere&lt;br /&gt;   al tamaño de los mensajes enviados por la red; como sabemos SOAP usa XML entonces cualquier dato binario en&lt;br /&gt;   el mensaje tiene que se codificado como texto, esto es implementado usualmente usando una codificación&lt;br /&gt;   en base64 el cual incrementa el tamaño del dato binario en cerca del 33%. MTOM proporciona una manera para&lt;br /&gt;   enviar datos binarios en su forma original, evitando cuanlquier incremento en tamaño debido a la codificación&lt;br /&gt;   como texto.&lt;br /&gt; --&gt;&lt;br /&gt; &lt;br /&gt; &lt;!-- Inicizalización del log4j --&gt;&lt;br /&gt; &lt;bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&gt;&lt;br /&gt;        &lt;property name="targetClass" value="org.springframework.util.Log4jConfigurer" /&gt;&lt;br /&gt;        &lt;property name="targetMethod" value="initLogging" /&gt;&lt;br /&gt;        &lt;property name="arguments"&gt;&lt;br /&gt;            &lt;list&gt;&lt;br /&gt;                &lt;value&gt;C:\\logs\spring.config&lt;/value&gt;&lt;br /&gt;            &lt;/list&gt;&lt;br /&gt;        &lt;/property&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;    &lt;br /&gt; &lt;!-- Cliente del servicio web implementado mediante Saaj --&gt;&lt;br /&gt;    &lt;bean id="clienteWebServiceSaaj" class="pe.com.slcsccy.pc.springws.client.CalculadoraClientSaajMTOM"&gt;&lt;br /&gt;     &lt;!-- Al constructor le pasamos una factoria de mensajes basada en Saaj --&gt;&lt;br /&gt;        &lt;constructor-arg&gt;&lt;br /&gt;            &lt;bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/&gt;&lt;br /&gt;        &lt;/constructor-arg&gt;&lt;br /&gt;        &lt;property name="defaultUri" value="http://localhost:7001/springws/serviciosWeb"/&gt;&lt;br /&gt;        &lt;property name="marshaller" ref="marshaller"/&gt;&lt;br /&gt;        &lt;property name="unmarshaller" ref="marshaller"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;!-- Axiom es un componente basado en StAX(Streaming Api for XML), cuya función principal es servir como&lt;br /&gt;    constructor del árbol de objetos pero a demanda, por ejemplo, suponiendo que tenemos una instancia XML muy grande&lt;br /&gt;    de unos 10MB(importacion.xml), entonces su árbol de objetos en memoria tambien sería inmensa y si de ese árbol&lt;br /&gt;    solo nos interesa cierta parte entonces solo deberiamos crear en memoria el árbol hasta la parte que nos interesa&lt;br /&gt;    y no todo el árbol como hace DOM, es decir, a demanda. Axiom tambien tiene soporte para XML Optimized&lt;br /&gt;    Packaging(XOP) y MTOM, XOP es una especificación que consiste en crear paquetes XML, un paquete XOP es creado&lt;br /&gt;    colocando una serialización del conjunto de información XML dentro de un formato de empaquetamiento extensible&lt;br /&gt;    como mime o multipart.    &lt;br /&gt;    --&gt;&lt;br /&gt;    &lt;!-- Cliente del servicio web implementado mediante Axiom --&gt;&lt;br /&gt;    &lt;bean id="clienteWebServiceAxiom" class="pe.com.slcsccy.pc.springws.client.CalculadoraClientAxiomMTOM"&gt;&lt;br /&gt;        &lt;constructor-arg&gt;&lt;br /&gt;            &lt;bean class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory"/&gt;&lt;br /&gt;        &lt;/constructor-arg&gt;&lt;br /&gt;        &lt;property name="defaultUri" value="http://localhost:7001/springws/serviciosWeb"/&gt;&lt;br /&gt;        &lt;property name="marshaller" ref="marshaller"/&gt;&lt;br /&gt;        &lt;property name="unmarshaller" ref="marshaller"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Marshaller cliente --&gt;&lt;br /&gt;    &lt;bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"&gt;&lt;br /&gt;        &lt;property name="contextPath" value="pe.com.slcsccy.pc.springws.client.schema"/&gt;&lt;br /&gt;        &lt;property name="mtomEnabled" value="true"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;&lt;br /&gt;&lt;/beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Una vez creados los beans anteriores la aplicación cliente llamará al bean 'clienteWebServiceSaaj' y ejecutará el método enviarZip(nombreArchivo), este buscará en el sistema de archivos el archivo zip y lo enviará al web service, para poder hacer esto es necesario que previamente se hayan creado los proxies del web service mediante una llamada a la meta maven 'jaxb2:xjc', está meta buscará el schema XSD y generará las fuentes java, es decir realizará el binding entre el web service y su cliente. El plugin que implementa la meta maven se ejecuta como parte del proceso generate sources de maven, pero para evitar que eclipse me muestre errores de compilación la ejecuto antes:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;plugin&gt;&lt;br /&gt;&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;&lt;br /&gt;&lt;artifactId&gt;jaxb2-maven-plugin&lt;/artifactId&gt;&lt;br /&gt;&lt;version&gt;1.3&lt;/version&gt;&lt;br /&gt;&lt;executions&gt;&lt;br /&gt;  &lt;execution&gt;&lt;br /&gt;    &lt;goals&gt;&lt;br /&gt;     &lt;goal&gt;xjc&lt;/goal&gt;&lt;br /&gt;    &lt;/goals&gt;&lt;br /&gt;  &lt;/execution&gt;&lt;br /&gt;&lt;/executions&gt;&lt;br /&gt;&lt;configuration&gt;&lt;br /&gt;  &lt;schemaDirectory&gt;src/main/resources&lt;/schemaDirectory&gt;&lt;br /&gt;  &lt;outputDirectory&gt;src/main/java&lt;/outputDirectory&gt;&lt;br /&gt;  &lt;packageName&gt;pe.com.slcsccy.pc.springws.client.schema&lt;/packageName&gt;&lt;br /&gt;  &lt;clearOutputDir&gt;false&lt;/clearOutputDir&gt;&lt;br /&gt;&lt;/configuration&gt;&lt;br /&gt;&lt;/plugin&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;La clase que crea el mensaje de envío al web service y que recepciona su respuesta mediante Saaj es la siguiente:CalculadoraClientSaajMTOM.java&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.pc.springws.client;&lt;br /&gt;&lt;br /&gt;import javax.activation.DataHandler;&lt;br /&gt;import javax.activation.FileDataSource;&lt;br /&gt;&lt;br /&gt;import org.springframework.ws.client.core.support.WebServiceGatewaySupport;&lt;br /&gt;import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;&lt;br /&gt;&lt;br /&gt;import pe.com.slcsccy.pc.springws.client.schema.MensajeRequest;&lt;br /&gt;import pe.com.slcsccy.pc.springws.client.schema.MensajeResponse;&lt;br /&gt;import pe.com.slcsccy.pc.springws.client.schema.ObjectFactory;&lt;br /&gt;import pe.com.slcsccy.pc.springws.client.schema.OperacionesZipType;&lt;br /&gt;&lt;br /&gt;public class CalculadoraClientSaajMTOM extends WebServiceGatewaySupport {&lt;br /&gt; &lt;br /&gt; private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt; &lt;br /&gt; public CalculadoraClientSaajMTOM(SaajSoapMessageFactory messageFactory) {&lt;br /&gt;        super(messageFactory);&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt; public MensajeResponse enviarZip(String nombreArchivo){&lt;br /&gt;  MensajeRequest mensajeRequest = objectFactory.createMensajeRequest();&lt;br /&gt;  OperacionesZipType zipType = new OperacionesZipType();&lt;br /&gt;  zipType.setNombreArchivoZip(nombreArchivo);&lt;br /&gt;  DataHandler handler = new DataHandler(new FileDataSource(nombreArchivo));&lt;br /&gt;  zipType.setArchivoZip(handler);&lt;br /&gt;  mensajeRequest.setOperacionesZip(zipType);&lt;br /&gt;        Object respuesta = getWebServiceTemplate().marshalSendAndReceive(mensajeRequest);&lt;br /&gt;        return (MensajeResponse)respuesta;&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;La clase que realiza lo mismo que la anterior pero mediante Axiom es la siguiente:CalculadoraClientAxiomMTOM.java&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.pc.springws.client;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;&lt;br /&gt;import javax.activation.DataHandler;&lt;br /&gt;import javax.activation.DataSource;&lt;br /&gt;import javax.activation.FileDataSource;&lt;br /&gt;import javax.xml.namespace.QName;&lt;br /&gt;import javax.xml.transform.TransformerException;&lt;br /&gt;&lt;br /&gt;import org.apache.axiom.om.OMAttribute;&lt;br /&gt;import org.apache.axiom.om.OMElement;&lt;br /&gt;import org.apache.axiom.om.OMNamespace;&lt;br /&gt;import org.apache.axiom.om.OMOutputFormat;&lt;br /&gt;import org.apache.axiom.om.OMText;&lt;br /&gt;import org.apache.axiom.soap.SOAPBody;&lt;br /&gt;import org.apache.axiom.soap.SOAPEnvelope;&lt;br /&gt;import org.apache.axiom.soap.SOAPFactory;&lt;br /&gt;import org.apache.axiom.soap.SOAPMessage;&lt;br /&gt;import org.springframework.ws.WebServiceMessage;&lt;br /&gt;import org.springframework.ws.client.core.WebServiceMessageCallback;&lt;br /&gt;import org.springframework.ws.client.core.WebServiceMessageExtractor;&lt;br /&gt;import org.springframework.ws.client.core.support.WebServiceGatewaySupport;&lt;br /&gt;import org.springframework.ws.soap.axiom.AxiomSoapMessage;&lt;br /&gt;import org.springframework.ws.soap.axiom.AxiomSoapMessageFactory;&lt;br /&gt;&lt;br /&gt;public class CalculadoraClientAxiomMTOM extends WebServiceGatewaySupport {&lt;br /&gt;&lt;br /&gt; public CalculadoraClientAxiomMTOM(AxiomSoapMessageFactory messageFactory) {&lt;br /&gt;        super(messageFactory);&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt; public void enviarZip(final String nombreArchivo){&lt;br /&gt;  &lt;br /&gt;  WebServiceMessageCallback requestCallback = new WebServiceMessageCallback() {&lt;br /&gt;            public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {&lt;br /&gt;                AxiomSoapMessage soapMessage = (AxiomSoapMessage) message;&lt;br /&gt;                SOAPMessage axiomMessage = soapMessage.getAxiomMessage();&lt;br /&gt;                SOAPFactory factory = (SOAPFactory) axiomMessage.getOMFactory();&lt;br /&gt;                &lt;br /&gt;                //Armamos el contenido del mensaje:&lt;br /&gt;                SOAPBody cuerpoMensaje = axiomMessage.getSOAPEnvelope().getBody();&lt;br /&gt;                OMNamespace ns = factory.createOMNamespace("http://www.slcsccy.com.pe/pc/springws/calculadora", "calc");&lt;br /&gt;                OMElement mensajeRequestElement = factory.createOMElement("mensajeRequest",ns);&lt;br /&gt;                cuerpoMensaje.addChild(mensajeRequestElement);&lt;br /&gt;                OMElement operacionesZipElement = factory.createOMElement("operacionesZip", ns);&lt;br /&gt;                &lt;br /&gt;                //Creo el archivo zip&lt;br /&gt;                OMAttribute nombreArchivoZipAttribute = factory.createOMAttribute("nombreArchivoZip",ns,nombreArchivo);&lt;br /&gt;                operacionesZipElement.addAttribute(nombreArchivoZipAttribute);&lt;br /&gt;                OMElement archivoZipElement = factory.createOMElement("archivoZip", ns);&lt;br /&gt;                DataSource dataSource = new FileDataSource(nombreArchivo);&lt;br /&gt;                DataHandler dataHandler = new DataHandler(dataSource);&lt;br /&gt;                OMText archivoZipText = factory.createOMText(dataHandler, true);&lt;br /&gt;                archivoZipElement.addChild(archivoZipText);&lt;br /&gt;                operacionesZipElement.addChild(archivoZipElement);&lt;br /&gt;                mensajeRequestElement.addChild(operacionesZipElement);&lt;br /&gt;&lt;br /&gt;                OMOutputFormat outputFormat = new OMOutputFormat();&lt;br /&gt;                outputFormat.setSOAP11(true);&lt;br /&gt;                outputFormat.setDoOptimize(true);&lt;br /&gt;                soapMessage.setOutputFormat(outputFormat);&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;  &lt;br /&gt;        WebServiceMessageExtractor responseExtractor = new WebServiceMessageExtractor() {&lt;br /&gt;            @SuppressWarnings("unchecked")&lt;br /&gt;   public Object extractData(WebServiceMessage message) throws IOException, TransformerException {&lt;br /&gt;             AxiomSoapMessage mensajeAxiom = (AxiomSoapMessage)message;&lt;br /&gt;             SOAPMessage mensaje = mensajeAxiom.getAxiomMessage();&lt;br /&gt;             SOAPEnvelope envelope = mensaje.getSOAPEnvelope();&lt;br /&gt;             SOAPBody body = envelope.getBody();&lt;br /&gt;             &lt;br /&gt;             OMElement mensajeResponse = body.getFirstElement();&lt;br /&gt;             OMElement resultados = mensajeResponse.getFirstElement();&lt;br /&gt;             &lt;br /&gt;             StringBuilder salida = new StringBuilder();&lt;br /&gt;             Iterator&lt;OMElement&gt; resultadosElement =  resultados.getChildren();&lt;br /&gt;             QName atributoId = new QName("http://www.slcsccy.com.pe/pc/springws/calculadora","id");&lt;br /&gt;             while(resultadosElement.hasNext()){&lt;br /&gt;              OMElement elemento = resultadosElement.next();&lt;br /&gt;              salida.append("id:"+elemento.getAttributeValue(atributoId)+",valor:"+elemento.getText()+"\n");&lt;br /&gt;             }&lt;br /&gt;             &lt;br /&gt;             logger.info("salida retorno:"+salida.toString());&lt;br /&gt;                return salida.toString();&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;        &lt;br /&gt;  @SuppressWarnings("unused")&lt;br /&gt;  String response = (String)getWebServiceTemplate().sendAndReceive(requestCallback,responseExtractor);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Una vez creado el proxy del web service ahora podemos conectarnos al web service y obtener los resultados esperados, veamos el log del cliente:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:text"&gt;&lt;br /&gt;2010-07-27 23:35:27 (AbstractBeanFactory.java:241) - Returning cached instance of singleton bean 'clienteWebServiceSaaj'&lt;br /&gt;2010-07-27 23:35:27 (WebServiceAccessor.java:110) - Opening [org.springframework.ws.transport.http.HttpUrlConnection@372a54] to [http://localhost:7001/springws/serviciosWeb]&lt;br /&gt;2010-07-27 23:35:28 (WebServiceTemplate.java:581) - Sent request [SaajSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeRequest]&lt;br /&gt;2010-07-27 23:35:35 (WebServiceTemplate.java:639) - Received response [SaajSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeResponse] for request [SaajSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeRequest]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ahora veamos el log del web service:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:text"&gt;&lt;br /&gt;2010-07-27 23:35:34 (WebServiceMessageReceiverObjectSupport.java:114) - Accepting incoming [org.springframework.ws.transport.http.HttpServletConnection@ea0dfc] to [http://localhost:7001/springws/serviciosWeb]&lt;br /&gt;2010-07-27 23:35:34 (MessageDispatcher.java:167) - Received request [SaajSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeRequest]&lt;br /&gt;2010-07-27 23:35:34 (AbstractMethodEndpointMapping.java:62) - Looking up endpoint for [{http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeRequest]&lt;br /&gt;2010-07-27 23:35:34 (MessageDispatcher.java:256) - Endpoint mapping [org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping@3311c0] maps request to endpoint [public pe.com.slcsccy.pc.springws.schema.MensajeResponse pe.com.slcsccy.pc.springws.ws.CalculadoraEndpointWithAnnotation.calcular(pe.com.slcsccy.pc.springws.schema.MensajeRequest) throws javax.xml.datatype.DatatypeConfigurationException,pe.com.slcsccy.pc.springws.exception.OperandoInvalidoException,pe.com.slcsccy.pc.springws.exception.UnzipException]&lt;br /&gt;2010-07-27 23:35:34 (AbstractValidatingInterceptor.java:179) - Request message validated&lt;br /&gt;2010-07-27 23:35:34 (AbstractLoggingInterceptor.java:160) - Request: &lt;ns2:mensajeRequest xmlns:ns2="http://www.slcsccy.com.pe/pc/springws/calculadora"&gt;&lt;ns2:operacionesZip ns2:nombreArchivoZip="operaciones.zip"&gt;&lt;ns2:archivoZip&gt;UEsDBBQAAAAIAE26+TxJUMN0JgAAACgAAAAPAAAAb3BlcmFjaW9uZXMudHh0PcixCQAgEATB/OEa0RV8T9D+K/Mjs2EaOVlsRf+qS2ysGJxbr3hQSwECFAAUAAAACABNuvk8SVDDdCYAAAAoAAAADwAAAAAAAAAAACAAAAAAAAAAb3BlcmFjaW9uZXMudHh0UEsFBgAAAAABAAEAPQAAAFMAAAAAAA==&lt;/ns2:archivoZip&gt;&lt;/ns2:operacionesZip&gt;&lt;/ns2:mensajeRequest&gt;&lt;br /&gt;2010-07-27 23:35:34 (MessageDispatcher.java:277) - Testing endpoint adapter [org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter@1d33c09]&lt;br /&gt;2010-07-27 23:35:35 (MarshallingMethodEndpointAdapter.java:146) - Unmarshalled payload request to [pe.com.slcsccy.pc.springws.schema.MensajeRequest@1ea9700]&lt;br /&gt;2010-07-27 23:35:35 (AbstractBeanFactory.java:241) - Returning cached instance of singleton bean 'calculadoraEndpoint'&lt;br /&gt;2010-07-27 23:35:35 (MarshallingMethodEndpointAdapter.java:153) - Marshalling [pe.com.slcsccy.pc.springws.schema.MensajeResponse@1fcbeda] to response payload&lt;br /&gt;2010-07-27 23:35:35 (AbstractLoggingInterceptor.java:160) - Response: &lt;ns2:mensajeResponse xmlns:ns2="http://www.slcsccy.com.pe/pc/springws/calculadora"&gt;&lt;ns2:resultados&gt;&lt;ns2:resultado ns2:id="1"&gt;80&lt;/ns2:resultado&gt;&lt;ns2:resultado ns2:id="2"&gt;16&lt;/ns2:resultado&gt;&lt;ns2:resultado ns2:id="3"&gt;1089&lt;/ns2:resultado&gt;&lt;ns2:resultado ns2:id="4"&gt;68&lt;/ns2:resultado&gt;&lt;/ns2:resultados&gt;&lt;/ns2:mensajeResponse&gt;&lt;br /&gt;2010-07-27 23:35:35 (AbstractValidatingInterceptor.java:221) - Response message validated&lt;br /&gt;2010-07-27 23:35:35 (MessageDispatcher.java:178) - Sent response [SaajSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeResponse] for request [SaajSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeRequest]&lt;br /&gt;2010-07-27 23:35:35 (FrameworkServlet.java:677) - Successfully completed request&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Con Axion el log en el cliente es el siguiente:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:text"&gt;&lt;br /&gt;2010-07-27 23:43:35 (AbstractBeanFactory.java:241) - Returning cached instance of singleton bean 'lifecycleProcessor'&lt;br /&gt;2010-07-27 23:43:35 (AbstractBeanFactory.java:241) - Returning cached instance of singleton bean 'clienteWebServiceAxiom'&lt;br /&gt;2010-07-27 23:43:35 (WebServiceAccessor.java:110) - Opening [org.springframework.ws.transport.http.HttpUrlConnection@1f4d2b] to [http://localhost:7001/springws/serviciosWeb]&lt;br /&gt;2010-07-27 23:43:35 (WebServiceTemplate.java:581) - Sent request [AxiomSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeRequest]&lt;br /&gt;2010-07-27 23:43:35 (OMOutputFormat.java:140) - Start getContentType: OMOutputFormat [ mimeBoundary =null rootContentId=null doOptimize=true doingSWA=false isSOAP11=true charSetEncoding=null xmlVersion=null contentType=null ignoreXmlDeclaration=false autoCloseWriter=false actionProperty=null optimizedThreshold=0]&lt;br /&gt;2010-07-27 23:43:35 (OMOutputFormat.java:166) - getContentType= {multipart/related; boundary="MIMEBoundary_be673ed239be738d78bcea194265e824bd3e5e2b92766546"; type="application/xop+xml"; start="&lt;0.ae673ed239be738d78bcea194265e824bd3e5e2b92766546@apache.org&gt;"; start-info="text/xml"}   OMOutputFormat [ mimeBoundary =MIMEBoundary_be673ed239be738d78bcea194265e824bd3e5e2b92766546 rootContentId=0.ae673ed239be738d78bcea194265e824bd3e5e2b92766546@apache.org doOptimize=true doingSWA=false isSOAP11=true charSetEncoding=null xmlVersion=null contentType=text/xml ignoreXmlDeclaration=false autoCloseWriter=false actionProperty=null optimizedThreshold=0]&lt;br /&gt;2010-07-27 23:43:35 (MTOMXMLStreamWriter.java:91) - OutputStream =class org.springframework.ws.transport.AbstractSenderConnection$RequestTransportOutputStream&lt;br /&gt;2010-07-27 23:43:35 (MTOMXMLStreamWriter.java:92) - OMFormat = OMOutputFormat [ mimeBoundary =MIMEBoundary_be673ed239be738d78bcea194265e824bd3e5e2b92766546 rootContentId=0.ae673ed239be738d78bcea194265e824bd3e5e2b92766546@apache.org doOptimize=true doingSWA=false isSOAP11=true charSetEncoding=null xmlVersion=null contentType=text/xml ignoreXmlDeclaration=false autoCloseWriter=false actionProperty=null optimizedThreshold=0]&lt;br /&gt;2010-07-27 23:43:35 (StAXUtils.java:615) - About to create XMLOutputFactory implementation with classloader=java.net.URLClassLoader@32d985&lt;br /&gt;2010-07-27 23:43:35 (StAXUtils.java:617) - The classloader for javax.xml.stream.XMLOutputFactory is: null&lt;br /&gt;2010-07-27 23:43:35 (StAXDialectDetector.java:219) - StAX implementation at jar:file:/I:/repo-maven/org/codehaus/woodstox/wstx-asl/3.2.9/wstx-asl-3.2.9.jar!/ is:&lt;br /&gt;  Title:         WoodSToX XML-processor&lt;br /&gt;  Symbolic name: null&lt;br /&gt;  Vendor:        woodstox.codehaus.org&lt;br /&gt;  Version:       3.2.9&lt;br /&gt;2010-07-27 23:43:35 (StAXDialectDetector.java:181) - Detected StAX dialect: Woodstox&lt;br /&gt;2010-07-27 23:43:35 (StAXUtils.java:635) - Created XMLOutputFactory = class org.apache.axiom.util.stax.wrapper.ImmutableXMLOutputFactory for classloader=java.net.URLClassLoader@32d985&lt;br /&gt;2010-07-27 23:43:35 (StAXUtils.java:637) - Size of XMLOutputFactory map =1&lt;br /&gt;2010-07-27 23:43:35 (StAXUtils.java:352) - XMLStreamWriter is org.apache.axiom.util.stax.dialect.WoodstoxStreamWriterWrapper&lt;br /&gt;2010-07-27 23:43:35 (OptimizationPolicyImpl.java:60) - Start MTOMXMLStreamWriter.isOptimizedThreshold()&lt;br /&gt;2010-07-27 23:43:35 (OptimizationPolicyImpl.java:65) - DataHandler fetched, starting optimized Threshold processing&lt;br /&gt;2010-07-27 23:43:35 (OptimizationPolicyImpl.java:71) - node should be added to binart NodeList for optimization&lt;br /&gt;2010-07-27 23:43:35 (MTOMXMLStreamWriter.java:182) - Calling MTOMXMLStreamWriter.flush&lt;br /&gt;2010-07-27 23:43:35 (MTOMXMLStreamWriter.java:190) - The XML writing is completed.  Now the attachments are written&lt;br /&gt;2010-07-27 23:43:35 (MTOMXMLStreamWriter.java:172) - close&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement Envelope by the StaxSOAPModelBuilder&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement Header by the StaxSOAPModelBuilder&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement Body by the StaxSOAPModelBuilder&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement mensajeResponse by the StaxSOAPModelBuilder&lt;br /&gt;2010-07-27 23:43:36 (WebServiceTemplate.java:639) - Received response [AxiomSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeResponse] for request [AxiomSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeRequest]&lt;br /&gt;2010-07-27 23:43:36 (WebServiceTemplate.java:639) - Received response [AxiomSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeResponse] for request [AxiomSoapMessage {http://www.slcsccy.com.pe/pc/springws/calculadora}mensajeRequest]&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement resultados by the StaxSOAPModelBuilder&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement resultado by the StaxSOAPModelBuilder&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement resultado by the StaxSOAPModelBuilder&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement resultado by the StaxSOAPModelBuilder&lt;br /&gt;2010-07-27 23:43:36 (StAXSOAPModelBuilder.java:278) - Build the OMElement resultado by the StaxSOAPModelBuilder&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El proyecto completo en eclipse te lo puedes bajar desde &lt;a href="http://sites.google.com/site/carloscacique/springwsclient.7z?attredirects=0&amp;d=1"&gt;AQUI&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-7296675852438799914?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/7296675852438799914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/07/spring-web-services-y-mtom-parte-2.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/7296675852438799914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/7296675852438799914'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/07/spring-web-services-y-mtom-parte-2.html' title='Spring Web Services y MTOM Parte 2'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-8337506847097662397</id><published>2010-07-26T21:05:00.000-07:00</published><updated>2010-07-28T13:30:50.395-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring web services'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring Web Services y MTOM Parte 1</title><content type='html'>&lt;div&gt;Hola que tal hace tiempo que no posteaba, así que decidí hacerlo con un nuevo tema, el de los web services, el tema tiene que ver con la arquitectura orientada a  servicios que estoy analizando desde hace un par de meses así que para recordar algo de los web services decidí implementar uno con spring web services; allí les va la definición simple del caso de uso que implementé:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;CUS: Calcular operaciones matemáticas.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Descripción breve del CUS: El CUS permitirá al usuario del web service calcular operaciones matemáticas de suma, resta, multiplicación y división, la información enviada al servicio web podrá estar en formato XML o en un archivo de texto  comprimido en formato zip que el web service procesará y generará la información en formato XML.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Un ejemplo de mensaje XML enviado al servidor será:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;calc:mensajeRequest xmlns:calc="http://www.slcsccy.com.pe/pc/springws/calculadora"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;br /&gt; &lt;calc:operaciones&gt;&lt;br /&gt;  &lt;calc:operacion calc:id="sumar1" calc:operador="+"&gt;&lt;br /&gt;   &lt;calc:operandos&gt;&lt;br /&gt;    &lt;calc:operando&gt;12&lt;/calc:operando&gt;&lt;br /&gt;    &lt;calc:operando&gt;13&lt;/calc:operando&gt;&lt;br /&gt;   &lt;/calc:operandos&gt;&lt;br /&gt;  &lt;/calc:operacion&gt;&lt;br /&gt;  &lt;calc:operacion calc:id="multiplicar1" calc:operador="*"&gt;&lt;br /&gt;   &lt;calc:operandos&gt;&lt;br /&gt;    &lt;calc:operando&gt;22&lt;/calc:operando&gt;&lt;br /&gt;    &lt;calc:operando&gt;5&lt;/calc:operando&gt;&lt;br /&gt;   &lt;/calc:operandos&gt;&lt;br /&gt;  &lt;/calc:operacion&gt;&lt;br /&gt; &lt;/calc:operaciones&gt;&lt;br /&gt;&lt;/calc:mensajeRequest&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Cuando implementamos web services lo podemos hacer mediante un servlet o un enterprise java bean(EJB)  en este caso como estoy usando spring la implementación será con un servlet, por lo que nuestra aplicación será un empaquetado WAR(Web ARchive), ahora una vez definido como será deployado el web service, debemos definir como será diseñado, el diseño de los web services puede realizarse de dos maneras: &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt; (1)Primero escribimos código java que implemente el web service y una vez terminado de codificado, lo deployamos en nuestro servidor de aplicaciones favorito y es éste ultimo quien creará la descripción de nuestro servicio web inspeccionando las clases anotadas con @WebService. Este tipo de diseño se conoce como 'JAVA to WSDL' ó primero java.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;(2)Primero escribimos el contrato del web service, el contrato en toda especificación de componente de software es la  descripción detallada de mensajes intercambiados entre este componente y su entorno, en el caso de los web services el  contrato o especificación es el descriptor del servicio web(WSDL). Este tipo de diseño se conoce como 'WSDL to JAVA' ó primero el contrato.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Como voy a usar spring para implementar mi web service lo primero que tengo que hacer es definir el formato de los  mensajes aceptados por mi web service así como el formato de los mensajes de respuesta de mi web service. Esta definición la realizo en un schema XSD:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"&lt;br /&gt; elementFormDefault="qualified" attributeFormDefault="qualified"&lt;br /&gt; targetNamespace="http://www.slcsccy.com.pe/pc/springws/calculadora"&lt;br /&gt; xmlns:calc="http://www.slcsccy.com.pe/pc/springws/calculadora"&lt;br /&gt; xmlns:xmime="http://www.w3.org/2005/05/xmlmime"&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;!-- Este schema define el contrato de servicio que el componente calculadora ofrecerá&lt;br /&gt;         a los clientes del servicio web, aquí se definen el formato de los mensajes de&lt;br /&gt;         envío así como de los formatos de respuesta, una vez especificado este schema XSD&lt;br /&gt;         en los archivos de configuración de spring, en tiempo de ejecución spring generará&lt;br /&gt;         el descriptor de despliegue del serviio web WSDL que es el que finalmente definirá&lt;br /&gt;         el contrato de interoperabilidad del servicio web.  --&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;!-- Formato del mensaje de envío. --&gt;&lt;br /&gt; &lt;xs:element name="mensajeRequest"&gt;&lt;br /&gt;  &lt;xs:complexType&gt;&lt;br /&gt;   &lt;!-- El calculo de las operaciones puede solicitarse mediante &lt;br /&gt;     XML o en un archivo zip --&gt;&lt;br /&gt;   &lt;xs:choice&gt;&lt;br /&gt;    &lt;!-- Si el envío lo realizan mediante xml --&gt;&lt;br /&gt;    &lt;xs:element name="operaciones"&gt;&lt;br /&gt;     &lt;xs:complexType&gt;&lt;br /&gt;      &lt;xs:sequence&gt;&lt;br /&gt;       &lt;xs:element name="operacion" type="calc:operacionType"&lt;br /&gt;        maxOccurs="unbounded" /&gt;&lt;br /&gt;      &lt;/xs:sequence&gt;&lt;br /&gt;     &lt;/xs:complexType&gt;&lt;br /&gt;    &lt;/xs:element&gt;&lt;br /&gt;    &lt;!-- Si el envío lo realizan mediante un archivo zip. El archivo zip comprime &lt;br /&gt;      un archivo de texto operaciones.txt con el siguiente formato: &lt;br /&gt;      operador,operando1,operando2,operandoN&lt;br /&gt;    --&gt;&lt;br /&gt;    &lt;xs:element name="operacionesZip" type="calc:operacionesZipType"/&gt;&lt;br /&gt;   &lt;/xs:choice&gt;&lt;br /&gt;  &lt;/xs:complexType&gt;&lt;br /&gt; &lt;/xs:element&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Formato de salida siempre es en XML  --&gt;&lt;br /&gt; &lt;xs:element name="mensajeResponse"&gt;&lt;br /&gt;  &lt;xs:complexType&gt;&lt;br /&gt;   &lt;xs:sequence&gt;&lt;br /&gt;    &lt;xs:element name="resultados"&gt;&lt;br /&gt;     &lt;xs:complexType&gt;&lt;br /&gt;      &lt;xs:sequence&gt;&lt;br /&gt;        &lt;xs:element name="resultado" maxOccurs="unbounded" type="calc:resultadoType"/&gt;&lt;br /&gt;      &lt;/xs:sequence&gt;&lt;br /&gt;     &lt;/xs:complexType&gt;&lt;br /&gt;    &lt;/xs:element&gt;&lt;br /&gt;   &lt;/xs:sequence&gt;&lt;br /&gt;  &lt;/xs:complexType&gt;&lt;br /&gt; &lt;/xs:element&gt;&lt;br /&gt;&lt;br /&gt; &lt;xs:simpleType name="operadorType"&gt;&lt;br /&gt;  &lt;xs:restriction base="xs:string"&gt;&lt;br /&gt;   &lt;xs:enumeration value="+" /&gt;&lt;br /&gt;   &lt;xs:enumeration value="-" /&gt;&lt;br /&gt;   &lt;xs:enumeration value="*" /&gt;&lt;br /&gt;   &lt;xs:enumeration value="/" /&gt;&lt;br /&gt;  &lt;/xs:restriction&gt;&lt;br /&gt; &lt;/xs:simpleType&gt;&lt;br /&gt;&lt;br /&gt; &lt;xs:complexType name="operacionType"&gt;&lt;br /&gt;  &lt;xs:sequence&gt;&lt;br /&gt;   &lt;xs:element name="operandos"&gt;&lt;br /&gt;    &lt;xs:complexType&gt;&lt;br /&gt;     &lt;xs:sequence&gt;&lt;br /&gt;      &lt;xs:element name="operando" minOccurs="2" maxOccurs="unbounded"&lt;br /&gt;       type="xs:decimal" /&gt;&lt;br /&gt;     &lt;/xs:sequence&gt;&lt;br /&gt;    &lt;/xs:complexType&gt;&lt;br /&gt;   &lt;/xs:element&gt;&lt;br /&gt;  &lt;/xs:sequence&gt;&lt;br /&gt;  &lt;xs:attribute name="id" /&gt;&lt;br /&gt;  &lt;xs:attribute name="operador" type="calc:operadorType" /&gt;&lt;br /&gt; &lt;/xs:complexType&gt;&lt;br /&gt; &lt;br /&gt; &lt;xs:complexType name="resultadoType"&gt;&lt;br /&gt;      &lt;xs:simpleContent&gt;&lt;br /&gt;        &lt;xs:extension base="xs:decimal"&gt;&lt;br /&gt;          &lt;xs:attribute name="id" use="required" type="xs:anySimpleType"/&gt;&lt;br /&gt;        &lt;/xs:extension&gt;&lt;br /&gt;      &lt;/xs:simpleContent&gt;&lt;br /&gt;    &lt;/xs:complexType&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;xs:complexType name="operacionesZipType"&gt;&lt;br /&gt;  &lt;xs:sequence&gt;&lt;br /&gt;   &lt;xs:element name="archivoZip" type="xs:base64Binary" xmime:expectedContentTypes="application/zip"/&gt;&lt;br /&gt;  &lt;/xs:sequence&gt;&lt;br /&gt;  &lt;xs:attribute name="nombreArchivoZip" /&gt;&lt;br /&gt; &lt;/xs:complexType&gt;&lt;br /&gt;&lt;br /&gt;&lt;/xs:schema&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El schema anterior me define los mensajes de entrada al web service y el formato de mensaje de respuesta.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ahora veamos el descriptor de despliegue de la aplicación web:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;display-name&gt;Servicio web simple que implementa una calculadora&lt;/display-name&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;servlet&gt;&lt;br /&gt;        &lt;servlet-name&gt;calculadora-annotation&lt;/servlet-name&gt;&lt;br /&gt;        &lt;servlet-class&gt;org.springframework.ws.transport.http.MessageDispatcherServlet&lt;/servlet-class&gt;&lt;br /&gt;        &lt;init-param&gt;&lt;br /&gt;            &lt;param-name&gt;transformWsdlLocations&lt;/param-name&gt;&lt;br /&gt;            &lt;param-value&gt;true&lt;/param-value&gt;&lt;br /&gt;        &lt;/init-param&gt;&lt;br /&gt;    &lt;/servlet&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;servlet-mapping&gt;&lt;br /&gt;        &lt;servlet-name&gt;calculadora-annotation&lt;/servlet-name&gt;&lt;br /&gt;        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;&lt;br /&gt;    &lt;/servlet-mapping&gt;&lt;br /&gt;&lt;br /&gt;&lt;/web-app&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;El descriptor anterior define el servlet calculadora-annotation-servlet.xml en forma implicita, dicho contenedor de beans es el siguiente:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans" &lt;br /&gt;    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;    xmlns:oxm="http://www.springframework.org/schema/oxm"&lt;br /&gt;    xmlns:sws="http://www.springframework.org/schema/web-services"&lt;br /&gt;       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;       http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd&lt;br /&gt;       http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-1.5.xsd"&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Inicizalización del log4j --&gt;&lt;br /&gt; &lt;bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&gt;&lt;br /&gt;        &lt;property name="targetClass" value="org.springframework.util.Log4jConfigurer" /&gt;&lt;br /&gt;        &lt;property name="targetMethod" value="initLogging" /&gt;&lt;br /&gt;        &lt;property name="arguments"&gt;&lt;br /&gt;            &lt;list&gt;&lt;br /&gt;                &lt;value&gt;C:\\logs\spring.config&lt;/value&gt;&lt;br /&gt;            &lt;/list&gt;&lt;br /&gt;        &lt;/property&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;!-- Mapeo del punto al cual llegarán las solicitudes del servicio web, se define el punto final &lt;br /&gt;      del servicio web por defecto así como los interceptores de validación y de logging.&lt;br /&gt;      Detecta los métodos anotados con @PayloadRoot sobre las clases anotadas con @Endpoint. --&gt;&lt;br /&gt;    &lt;bean id="annotationMapping" &lt;br /&gt;     class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"&gt;&lt;br /&gt;        &lt;property name="interceptors"&gt;&lt;br /&gt;            &lt;list&gt;&lt;br /&gt;                &lt;ref local="validatingInterceptor"/&gt;&lt;br /&gt;                &lt;ref local="loggingInterceptor"/&gt;&lt;br /&gt;            &lt;/list&gt;&lt;br /&gt;        &lt;/property&gt;&lt;br /&gt;        &lt;property name="order" value="1"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;    &lt;br /&gt; &lt;!-- Resolvedor de excepciones que genera el servicio web implementado mediante anotaciones @SoapFault --&gt;&lt;br /&gt;    &lt;bean class="org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver"&gt;&lt;br /&gt;        &lt;property name="order" value="1"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- Interceptor de validación de mensajes, valida que los mensajes de entrada y salida del servicio web &lt;br /&gt;         se correspondan con el XSD  --&gt;&lt;br /&gt;    &lt;bean id="validatingInterceptor"&lt;br /&gt;          class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor"&gt;&lt;br /&gt;        &lt;property name="xsdSchema" ref="schema"/&gt;&lt;br /&gt;        &lt;property name="validateRequest" value="true"/&gt;&lt;br /&gt;        &lt;property name="validateResponse" value="true"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;!-- Interceptor para procesar mensajes de log --&gt;&lt;br /&gt;    &lt;bean id="loggingInterceptor" class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/&gt;&lt;br /&gt;&lt;br /&gt; &lt;!-- El punto al cual todas las solicitudes que ingresen por medio del servicio web llegarán y procesarán  --&gt;&lt;br /&gt;    &lt;bean id="calculadoraEndpoint" class="pe.com.slcsccy.pc.springws.ws.CalculadoraEndpointWithAnnotation"&gt;&lt;br /&gt;     &lt;property name="calculadoraService" ref="calculadoraService"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;!-- Definiciones a tener en cuenta:&lt;br /&gt;      Marshalling: Proceso por el cual se crea instancias xml a partir de objetos java.&lt;br /&gt;      Ejemplo: instancia persona -&gt; persona.xml&lt;br /&gt;      Unmarshalling: Proceso por el cual se crea un arbol de objetos a partir de una instancia xml&lt;br /&gt;      Ejemplo: persona.xml -&gt; instancia persona(el objeto, no la clase).&lt;br /&gt;      La declaración xml siguiente indica que se creará un objeto que realizará los procesos&lt;br /&gt;      de marshalling(formación de xml a partir de instancias java) y &lt;br /&gt;      de unmarshalling(formación de java a partir de instancias xml), como parámetros&lt;br /&gt;      tiene su identificador y el contexto(contextPath) desde el cuál analizará las clases &lt;br /&gt;      para realizar los procesos de marshall y unmarshall&lt;br /&gt;     --&gt;&lt;br /&gt;    &lt;oxm:jaxb2-marshaller id="formador" contextPath="pe.com.slcsccy.pc.springws.schema" /&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;!-- Indica que un unmarshaller debe ser usado para convertir un mensaje xml enviado al servicio &lt;br /&gt;      web a un árbol de objetos y una vez convertido setearlo en los parámetros de un método &lt;br /&gt;      tambien es usado para retornar valores marshalled(de objetos a java) en los mensajes de respuesta --&gt; &lt;br /&gt;    &lt;sws:marshalling-endpoints marshaller="formador" unmarshaller="formador"/&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;!-- Este bean define al descriptor del servicio web(WSDL) que es generado en tiempo de ejecución &lt;br /&gt;         El descriptor de despliegue del servicio web(WSDL) puede ser recibido ingresando a &lt;br /&gt;         http://server:port/contexto/servlet/locationUri/nombreBean.wsdl, para mi caso es:&lt;br /&gt;         http://192.168.1.33:7001/springws/serviciosWeb/calculadoraDescriptor.wsdl&lt;br /&gt;         En este caso el nombre del bean se corresponde con el nombre del archivo --&gt;&lt;br /&gt;    &lt;bean id="calculadoraDescriptor" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"&gt;&lt;br /&gt;        &lt;property name="schema" ref="schema"/&gt;&lt;br /&gt;        &lt;property name="portTypeName" value="Calculadora"/&gt;&lt;br /&gt;        &lt;property name="locationUri" value="/serviciosWeb"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;!-- Este bean define el schema XSD que soportará el servicio web --&gt;&lt;br /&gt;    &lt;bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema"&gt;&lt;br /&gt;        &lt;property name="xsd" value="/WEB-INF/calculadora.xsd"/&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Nuestro bean de servicios --&gt;&lt;br /&gt;    &lt;bean id="calculadoraService" class="pe.com.slcsccy.pc.springws.service.impl.CalculadoraServiceImpl"/&gt;&lt;br /&gt;    &lt;br /&gt;&lt;/beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;A continuación veamos la clase principal que implementa el web service mediante anotaciones de spring:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.pc.springws.ws;&lt;br /&gt;&lt;br /&gt;import java.io.ByteArrayOutputStream;&lt;br /&gt;import java.math.BigDecimal;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.zip.ZipInputStream;&lt;br /&gt;&lt;br /&gt;import javax.activation.DataHandler;&lt;br /&gt;import javax.activation.DataSource;&lt;br /&gt;import javax.xml.datatype.DatatypeConfigurationException;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.logging.Log;&lt;br /&gt;import org.apache.commons.logging.LogFactory;&lt;br /&gt;import org.springframework.ws.server.endpoint.annotation.Endpoint;&lt;br /&gt;import org.springframework.ws.server.endpoint.annotation.PayloadRoot;&lt;br /&gt;&lt;br /&gt;import pe.com.slcsccy.pc.springws.domain.Operacion;&lt;br /&gt;import pe.com.slcsccy.pc.springws.exception.OperandoInvalidoException;&lt;br /&gt;import pe.com.slcsccy.pc.springws.exception.UnzipException;&lt;br /&gt;import pe.com.slcsccy.pc.springws.schema.MensajeRequest;&lt;br /&gt;import pe.com.slcsccy.pc.springws.schema.MensajeResponse;&lt;br /&gt;import pe.com.slcsccy.pc.springws.schema.ObjectFactory;&lt;br /&gt;import pe.com.slcsccy.pc.springws.schema.OperacionType;&lt;br /&gt;import pe.com.slcsccy.pc.springws.schema.OperacionesZipType;&lt;br /&gt;import pe.com.slcsccy.pc.springws.schema.ResultadoType;&lt;br /&gt;import pe.com.slcsccy.pc.springws.schema.MensajeResponse.Resultados;&lt;br /&gt;import pe.com.slcsccy.pc.springws.service.CalculadoraService;&lt;br /&gt;&lt;br /&gt;@Endpoint&lt;br /&gt;public class CalculadoraEndpointWithAnnotation {&lt;br /&gt;&lt;br /&gt; private final Log logger = LogFactory.getLog(CalculadoraEndpointWithAnnotation.class);&lt;br /&gt; public static final String NAMESPACE_URI = "http://www.slcsccy.com.pe/pc/springws/calculadora";&lt;br /&gt; public static final String REQUEST_LOCAL_NAME = "mensajeRequest";&lt;br /&gt; public static final String RESPONSE_LOCAL_NAME = "mensajeResponse";&lt;br /&gt; private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt; &lt;br /&gt; private CalculadoraService calculadoraService;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Antes de la ejecución de este método la declaración:&lt;br /&gt;  * &amp;lt;sws:marshalling-endpoints marshaller="formador" unmarshaller="formador"/&gt;&lt;br /&gt;  * se a encargado de crear el arbol de objetos desde un archivo xml, hay&lt;br /&gt;  * que recordar que el servicio web recibe XML y que es spring integrado con&lt;br /&gt;  * JAXB quién realiza el proceso de unmarshalling y marshalling para crear el&lt;br /&gt;  * arbol de objetos(MensajeRequest) y el formato de respuesta respectivamente. &lt;br /&gt;  * */&lt;br /&gt; @PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI)&lt;br /&gt; public MensajeResponse calcular(MensajeRequest request) &lt;br /&gt;  throws DatatypeConfigurationException,OperandoInvalidoException,UnzipException {&lt;br /&gt;  logger.info("Mensaje recibido.");&lt;br /&gt;  &lt;br /&gt;  //Empiezo a crear el objeto de respuesta&lt;br /&gt;  MensajeResponse response = objectFactory.createMensajeResponse();&lt;br /&gt;  Resultados resultados = objectFactory.createMensajeResponseResultados();&lt;br /&gt;  response.setResultados(resultados);&lt;br /&gt;  &lt;br /&gt;  //Si el cliente del servicio web envió las operaciones en formato XML&lt;br /&gt;  if(request.getOperaciones()!=null){&lt;br /&gt;   List&amp;lt;OperacionType&gt; operaciones = request.getOperaciones().getOperacion();&lt;br /&gt;   for(OperacionType operacion:operaciones){&lt;br /&gt;    if( operacion.getOperador().equals("/") &amp;&amp; &lt;br /&gt;      operacion.getOperandos().getOperando().get(1).equals(BigDecimal.ZERO))&lt;br /&gt;     throw new OperandoInvalidoException("No se puede dividir por cero.");&lt;br /&gt;    &lt;br /&gt;    BigDecimal calculo = calculadoraService.calcular(operacion.getOperandos().getOperando(), operacion.getOperador());&lt;br /&gt;    ResultadoType resultado = objectFactory.createResultadoType();&lt;br /&gt;    resultado.setId(operacion.getId());//Copio los identificadores.&lt;br /&gt;    resultado.setValue(calculo);&lt;br /&gt;    resultados.getResultado().add(resultado);&lt;br /&gt;    logger.info("Respuesta calculada en el server:"+calculo.toPlainString());&lt;br /&gt;   } &lt;br /&gt;  }&lt;br /&gt;  else{&lt;br /&gt;   //Si no me enviaron las operaciones en formato XML, entonces me las&lt;br /&gt;   //enviaron en un archivo comprimido en formato zip:&lt;br /&gt;   OperacionesZipType operacionesZip = request.getOperacionesZip();&lt;br /&gt;   String archivoAsString = unzipOperaciones(operacionesZip.getArchivoZip());&lt;br /&gt;   List&amp;lt;Operacion&gt; operacionesDomain = crearOperaciones(archivoAsString);&lt;br /&gt;   int idSecuencial = 1;&lt;br /&gt;   for(Operacion operacion:operacionesDomain){&lt;br /&gt;    BigDecimal calculo = calculadoraService.calcular(operacion.getOperandos(), operacion.getOperador());&lt;br /&gt;    ResultadoType resultado = objectFactory.createResultadoType();&lt;br /&gt;    resultado.setId(String.valueOf(idSecuencial++));&lt;br /&gt;    resultado.setValue(calculo);&lt;br /&gt;    resultados.getResultado().add(resultado);&lt;br /&gt;    logger.info("Respuesta calculada en el server:"+calculo.toPlainString());&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return response; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Descomprime el archivo zip en una cadena&lt;br /&gt;  * */&lt;br /&gt; private String unzipOperaciones(DataHandler handlerZip)throws UnzipException{&lt;br /&gt;  DataSource dataSource = null;&lt;br /&gt;  ZipInputStream zis = null;&lt;br /&gt;  String archivoAsString = null;&lt;br /&gt;  try{&lt;br /&gt;   dataSource = handlerZip.getDataSource();&lt;br /&gt;   zis = new ZipInputStream(dataSource.getInputStream());&lt;br /&gt;   if(zis.getNextEntry() != null){&lt;br /&gt;    int bytesLeidos = 0;&lt;br /&gt;    int BUFFER_SIZE = 1024*10;&lt;br /&gt;    byte buffer[] = new byte[BUFFER_SIZE];&lt;br /&gt;    ByteArrayOutputStream bos = new ByteArrayOutputStream();&lt;br /&gt;    while( (bytesLeidos = zis.read(buffer,0,BUFFER_SIZE)) != -1 ){&lt;br /&gt;     bos.write( buffer, 0, bytesLeidos);&lt;br /&gt;    }&lt;br /&gt;    archivoAsString = new String(bos.toByteArray());&lt;br /&gt;   }&lt;br /&gt;   zis.close();&lt;br /&gt;  }catch(Exception e){&lt;br /&gt;   logger.info("Error al leer el zip.",e);&lt;br /&gt;   throw new UnzipException("Error al leer el zip.");&lt;br /&gt;  }finally{&lt;br /&gt;  }&lt;br /&gt;  return archivoAsString;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Crea una lista de operaciones a partir de un cadena de texto. &lt;br /&gt;  * */&lt;br /&gt; private List&amp;lt;Operacion&gt; crearOperaciones(String archivoAsString){&lt;br /&gt;  Operacion operacion = null;&lt;br /&gt;  List&amp;lt;Operacion&gt; operaciones = new ArrayList&amp;lt;Operacion&gt;();&lt;br /&gt;  String[] lineas = archivoAsString.split("\n");&lt;br /&gt;  for(int i=0;i&amp;lt;lineas.length;i++){&lt;br /&gt;   logger.info("Linea a analizar:"+lineas[i]);&lt;br /&gt;   String[] operacionToken = lineas[i].split(",");&lt;br /&gt;   List&amp;lt;BigDecimal&gt; operandos = new ArrayList&amp;lt;BigDecimal&gt;();&lt;br /&gt;   for(int j=1;j&amp;lt;operacionToken.length;j++){&lt;br /&gt;    logger.info("Operador a procesar:"+operacionToken[j]);&lt;br /&gt;    operandos.add(new BigDecimal(operacionToken[j].trim()));&lt;br /&gt;   }&lt;br /&gt;   operacion = new Operacion(operacionToken[0],operandos);&lt;br /&gt;   operaciones.add(operacion);&lt;br /&gt;  }&lt;br /&gt;  return operaciones;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; public CalculadoraService getCalculadoraService() {&lt;br /&gt;  return calculadoraService;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; public void setCalculadoraService(CalculadoraService calculadoraService) {&lt;br /&gt;  this.calculadoraService = calculadoraService;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Como siempre para que el desarrollo sea más eficiente, generar fuentes con JAXB, compilar y deployar a weblogic uso MAVEN, el descriptor del proyecto es el siguiente:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;&lt;br /&gt; &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;&lt;br /&gt; &lt;groupId&gt;pe.com.slcsccy.pc&lt;/groupId&gt;&lt;br /&gt; &lt;artifactId&gt;springws&lt;/artifactId&gt;&lt;br /&gt; &lt;packaging&gt;war&lt;/packaging&gt;&lt;br /&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;&lt;br /&gt; &lt;name&gt;Aplicación de ejemplo básica de spring web services&lt;/name&gt;&lt;br /&gt; &lt;url&gt;http://maven.apache.org&lt;/url&gt;&lt;br /&gt;&lt;br /&gt; &lt;properties&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.version&gt;2.9.1&lt;/weblogic-maven-plugin.version&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.adminServerProtocol&gt;t3&lt;/weblogic-maven-plugin.adminServerProtocol&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.upload&gt;false&lt;/weblogic-maven-plugin.upload&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.verbose&gt;true&lt;/weblogic-maven-plugin.verbose&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.debug&gt;true&lt;/weblogic-maven-plugin.debug&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.exploded&gt;false&lt;/weblogic-maven-plugin.exploded&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.continueOnFailure&gt;false&lt;/weblogic-maven-plugin.continueOnFailure&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.noExit&gt;true&lt;/weblogic-maven-plugin.noExit&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.adminServerHostName&gt;localhost&lt;/weblogic-maven-plugin.adminServerHostName&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.adminServerPort&gt;7001&lt;/weblogic-maven-plugin.adminServerPort&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.userId&gt;ccacique&lt;/weblogic-maven-plugin.userId&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.password&gt;xxx&lt;/weblogic-maven-plugin.password&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.targetNames&gt;AdminServer&lt;/weblogic-maven-plugin.targetNames&gt;&lt;br /&gt;  &lt;weblogic-maven-plugin.remote&gt;true&lt;/weblogic-maven-plugin.remote&gt;&lt;br /&gt; &lt;/properties&gt;&lt;br /&gt;&lt;br /&gt; &lt;profiles&gt;&lt;br /&gt;  &lt;profile&gt;&lt;br /&gt;   &lt;id&gt;jdk14-jdk15&lt;/id&gt;&lt;br /&gt;   &lt;activation&gt;&lt;br /&gt;    &lt;jdk&gt;!1.6&lt;/jdk&gt;&lt;br /&gt;   &lt;/activation&gt;&lt;br /&gt;   &lt;dependencies&gt;&lt;br /&gt;    &lt;dependency&gt;&lt;br /&gt;     &lt;groupId&gt;javax.xml.stream&lt;/groupId&gt;&lt;br /&gt;     &lt;artifactId&gt;stax-api&lt;/artifactId&gt;&lt;br /&gt;    &lt;/dependency&gt;&lt;br /&gt;    &lt;dependency&gt;&lt;br /&gt;     &lt;groupId&gt;javax.xml.soap&lt;/groupId&gt;&lt;br /&gt;     &lt;artifactId&gt;saaj-api&lt;/artifactId&gt;&lt;br /&gt;    &lt;/dependency&gt;&lt;br /&gt;   &lt;/dependencies&gt;&lt;br /&gt;  &lt;/profile&gt;&lt;br /&gt; &lt;/profiles&gt;&lt;br /&gt;&lt;br /&gt; &lt;dependencies&gt;&lt;br /&gt;  &lt;dependency&gt;&lt;br /&gt;   &lt;groupId&gt;junit&lt;/groupId&gt;&lt;br /&gt;   &lt;artifactId&gt;junit&lt;/artifactId&gt;&lt;br /&gt;   &lt;version&gt;3.8.1&lt;/version&gt;&lt;br /&gt;   &lt;scope&gt;test&lt;/scope&gt;&lt;br /&gt;  &lt;/dependency&gt;&lt;br /&gt;  &lt;dependency&gt;&lt;br /&gt;   &lt;groupId&gt;org.springframework.ws&lt;/groupId&gt;&lt;br /&gt;   &lt;artifactId&gt;spring-ws-core&lt;/artifactId&gt;&lt;br /&gt;   &lt;version&gt;2.0.0-M1&lt;/version&gt;&lt;br /&gt;  &lt;/dependency&gt;&lt;br /&gt;  &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;javax.xml.bind&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;jaxb-api&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;2.0&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;com.sun.xml.bind&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;jaxb-impl&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;2.0.3&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;         &lt;groupId&gt;log4j&lt;/groupId&gt;&lt;br /&gt;         &lt;artifactId&gt;log4j&lt;/artifactId&gt;&lt;br /&gt;         &lt;version&gt;1.2.16&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt; &lt;/dependencies&gt;&lt;br /&gt; &lt;build&gt;&lt;br /&gt;  &lt;finalName&gt;springws&lt;/finalName&gt;&lt;br /&gt;  &lt;plugins&gt;&lt;br /&gt;   &lt;plugin&gt;&lt;br /&gt;                &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;&lt;br /&gt;                &lt;artifactId&gt;jaxb2-maven-plugin&lt;/artifactId&gt;&lt;br /&gt;                &lt;version&gt;1.3&lt;/version&gt;&lt;br /&gt;                &lt;executions&gt;&lt;br /&gt;                    &lt;execution&gt;&lt;br /&gt;                        &lt;goals&gt;&lt;br /&gt;                            &lt;goal&gt;xjc&lt;/goal&gt;&lt;br /&gt;                        &lt;/goals&gt;&lt;br /&gt;                    &lt;/execution&gt;&lt;br /&gt;               &lt;/executions&gt;&lt;br /&gt;               &lt;configuration&gt;&lt;br /&gt;                 &lt;schemaDirectory&gt;src/main/webapp/WEB-INF&lt;/schemaDirectory&gt;&lt;br /&gt;     &lt;outputDirectory&gt;src/main/java&lt;/outputDirectory&gt;&lt;br /&gt;     &lt;packageName&gt;pe.com.slcsccy.pc.springws.schema&lt;/packageName&gt;&lt;br /&gt;     &lt;clearOutputDir&gt;false&lt;/clearOutputDir&gt;&lt;br /&gt;               &lt;/configuration&gt;&lt;br /&gt;           &lt;/plugin&gt;&lt;br /&gt;   &lt;plugin&gt;&lt;br /&gt;    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;&lt;br /&gt;    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;&lt;br /&gt;    &lt;configuration&gt;&lt;br /&gt;     &lt;source&gt;1.6&lt;/source&gt;&lt;br /&gt;     &lt;target&gt;1.6&lt;/target&gt;&lt;br /&gt;    &lt;/configuration&gt;&lt;br /&gt;   &lt;/plugin&gt;&lt;br /&gt;   &lt;plugin&gt;&lt;br /&gt;    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;&lt;br /&gt;    &lt;artifactId&gt;weblogic-maven-plugin&lt;/artifactId&gt;&lt;br /&gt;    &lt;version&gt;${weblogic-maven-plugin.version}&lt;/version&gt;&lt;br /&gt;    &lt;configuration&gt;&lt;br /&gt;     &lt;upload&gt;${weblogic-maven-plugin.upload}&lt;/upload&gt;&lt;br /&gt;     &lt;verbose&gt;${weblogic-maven-plugin.verbose}&lt;/verbose&gt;&lt;br /&gt;     &lt;debug&gt;${weblogic-maven-plugin.debug}&lt;/debug&gt;&lt;br /&gt;     &lt;exploded&gt;${weblogic-maven-plugin.exploded}&lt;/exploded&gt;&lt;br /&gt;     &lt;noExit&gt;${weblogic-maven-plugin.noExit}&lt;/noExit&gt;&lt;br /&gt;     &lt;continueOnFailure&gt;${weblogic-maven-plugin.continueOnFailure}&lt;/continueOnFailure&gt;&lt;br /&gt;     &lt;adminServerHostName&gt;${weblogic-maven-plugin.adminServerHostName}&lt;/adminServerHostName&gt;&lt;br /&gt;     &lt;adminServerPort&gt;${weblogic-maven-plugin.adminServerPort}&lt;/adminServerPort&gt;&lt;br /&gt;     &lt;adminServerProtocol&gt;${weblogic-maven-plugin.adminServerProtocol}&lt;/adminServerProtocol&gt;&lt;br /&gt;     &lt;userId&gt;${weblogic-maven-plugin.userId}&lt;/userId&gt;&lt;br /&gt;     &lt;password&gt;${weblogic-maven-plugin.password}&lt;/password&gt;&lt;br /&gt;     &lt;remote&gt;${weblogic-maven-plugin.remote}&lt;/remote&gt;&lt;br /&gt;     &lt;targetNames&gt;${weblogic-maven-plugin.targetNames}&lt;/targetNames&gt;&lt;br /&gt;    &lt;/configuration&gt;&lt;br /&gt;    &lt;dependencies&gt;&lt;br /&gt;     &lt;dependency&gt;&lt;br /&gt;      &lt;groupId&gt;weblogic&lt;/groupId&gt;&lt;br /&gt;      &lt;artifactId&gt;wlfullclient&lt;/artifactId&gt;&lt;br /&gt;      &lt;version&gt;10.3&lt;/version&gt;&lt;br /&gt;     &lt;/dependency&gt;&lt;br /&gt;     &lt;dependency&gt;&lt;br /&gt;      &lt;groupId&gt;com.bea&lt;/groupId&gt;&lt;br /&gt;      &lt;artifactId&gt;com.bea.core.descriptor.wl&lt;/artifactId&gt;&lt;br /&gt;      &lt;version&gt;1.1.0.0&lt;/version&gt;&lt;br /&gt;     &lt;/dependency&gt;&lt;br /&gt;    &lt;/dependencies&gt;&lt;br /&gt;   &lt;/plugin&gt;&lt;br /&gt;  &lt;/plugins&gt;&lt;br /&gt; &lt;/build&gt;&lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;En el siguiente post expondré los clientes del web service que envía y reciben las respuestas del web service.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El proyecto completo en eclipse te lo puedes bajar desde &lt;a href="http://sites.google.com/site/carloscacique/springws.7z?attredirects=0&amp;d=1"&gt;AQUI&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-8337506847097662397?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/8337506847097662397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/07/spring-web-services-y-mtom-parte-1.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/8337506847097662397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/8337506847097662397'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/07/spring-web-services-y-mtom-parte-1.html' title='Spring Web Services y MTOM Parte 1'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-3065417254299392908</id><published>2010-05-24T19:20:00.000-07:00</published><updated>2010-05-24T19:41:16.278-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plsql'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>PLSQL Básico2</title><content type='html'>&lt;div&gt;Más ejemplos sobre PLSQL, en este post veamos como podemos crear procedimientos que utilicen arrays,collections y estructuras de datos derivadas de estos&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 1: &lt;/b&gt;Muestra el uso de arrays asociativos&lt;br /&gt;Definimos un tipo de la forma: &lt;i&gt;TYPE miHashType IS TABLE OF NUMBER INDEX BY VARCHAR2(6);&lt;/i&gt; &lt;br /&gt;La clausula &lt;i&gt;TYPE&lt;/i&gt; especifica que vamos a definir un nuevo tipo.&lt;br /&gt;El código &lt;i&gt;miHashType&lt;/i&gt; es el nombre del nuevo tipo, es como una nueva clase&lt;br /&gt;La clausula &lt;i&gt;IS TABLE OF NUMBER&lt;/i&gt; indica que el arreglo asociativo va a tener valores de tipo &lt;i&gt;NUMBER&lt;/i&gt;&lt;br /&gt;La clausula &lt;i&gt;BY VARCHAR2(5)&lt;/i&gt; indica que los valores de los indices van a ser del tipo &lt;i&gt;VARCHAR2(6)&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE collection01 IS &lt;br /&gt;&lt;br /&gt;TYPE miHashType IS TABLE OF NUMBER INDEX BY VARCHAR2(6);&lt;br /&gt;arreglo1 miHashType;&lt;br /&gt;arreglo2 miHashType;&lt;br /&gt;&lt;br /&gt;TYPE miEmployeeType IS TABLE OF employees%rowtype INDEX BY PLS_INTEGER;&lt;br /&gt;empleadosArray miEmployeeType;&lt;br /&gt;&lt;br /&gt;-- Los tipos anidados pueden almacenar un número ilimitado de elementos&lt;br /&gt;TYPE miTableType IS TABLE OF VARCHAR2(20);&lt;br /&gt;arregloV1 miTableType;&lt;br /&gt;arregloV2 miTableType;&lt;br /&gt;&lt;br /&gt;-- Los tipos varray tienen un número máximo de elementos&lt;br /&gt;TYPE miArregloType IS VARRAY(4) OF VARCHAR2(10);&lt;br /&gt;varreglo1 miArregloType;&lt;br /&gt;varreglo2 miArregloType;&lt;br /&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  -- Agregamos 3 entradas al primer arreglo:&lt;br /&gt;  arreglo1('clave1') := 666;&lt;br /&gt;  arreglo1('clave2') := 667;&lt;br /&gt;  arreglo1('clave3') := 668;&lt;br /&gt;  &lt;br /&gt;  -- Agregamos 3 entradas al primer arreglo:&lt;br /&gt;  arreglo2('clave1') := 100;&lt;br /&gt;  arreglo2('clave2') := 101;&lt;br /&gt;  arreglo2('clave3') := 102;&lt;br /&gt;  arreglo2('clave4') := 103;&lt;br /&gt;  arreglo2('clave5') := 104;&lt;br /&gt;  arreglo2('clave6') := 105;&lt;br /&gt;  &lt;br /&gt;  -- Ahora mostramos los valores deacuerdo a su clave:&lt;br /&gt;  dbms_output.put_line('El valor del arreglo asociativo arreglo2(''clave2''):'||arreglo2('clave2'));&lt;br /&gt;  &lt;br /&gt;  -- Obtenemos los datos de un empleado:&lt;br /&gt;  SELECT * INTO empleadosArray(100) FROM employees WHERE employee_id = 100;&lt;br /&gt;  dbms_output.put_line('Nombre del empleado: '||empleadosArray(100).first_name);&lt;br /&gt;  dbms_output.put_line('Apellidos del empleado: '||empleadosArray(100).last_name);&lt;br /&gt;  dbms_output.put_line('Email del empleado: '||empleadosArray(100).email);&lt;br /&gt;  &lt;br /&gt;  -- Ahora asignamos los valores a los arreglos:&lt;br /&gt;  arregloV1 := miTableType('carlos','alberto','cacique','yupanqui','certificado','en','java','y','oracle');&lt;br /&gt;  arregloV2 := miTableType('zaida','angelica');&lt;br /&gt;  varreglo1 := miArregloType('uno','dos');&lt;br /&gt;  -- Con el metodo EXTEND extendemos el arreglo dinamico, el primer argument &lt;br /&gt;  -- especifica cuantos elementos más creamos y el segundo el valor que se va a &lt;br /&gt;  -- copiar de los elementos existentes a los elementos nuevos&lt;br /&gt;  varreglo1.EXTEND(2,1);&lt;br /&gt;  --varreglo1(3) := 'tres';&lt;br /&gt;  --varreglo1(4) := 'cuatro';&lt;br /&gt;  varreglo2 := miArregloType('primero','segundo','tercero','cuarto');&lt;br /&gt;  &lt;br /&gt;  -- Ahora mostramos los valores de los tipos anidados;&lt;br /&gt;  FOR i IN arregloV1.FIRST..arregloV1.LAST LOOP&lt;br /&gt;   dbms_output.put_line('arregloV1('||i||'):'||arregloV1(i));&lt;br /&gt;  END LOOP;&lt;br /&gt;  FOR i IN arregloV2.FIRST..arregloV2.LAST LOOP&lt;br /&gt;     dbms_output.put_line('arregloV2('||i||'):'||arregloV2(i));&lt;br /&gt;  END LOOP;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  -- Ahora mostramos los valores de los tipos varrays&lt;br /&gt;  FOR i IN varreglo1.FIRST..varreglo1.LAST LOOP&lt;br /&gt;     dbms_output.put_line('varreglo1('||i||'):'||varreglo1(i));&lt;br /&gt;  END LOOP;&lt;br /&gt;  FOR i IN varreglo2.FIRST..varreglo2.LAST LOOP&lt;br /&gt;       dbms_output.put_line('varreglo2('||i||'):'||varreglo2(i));&lt;br /&gt;  END LOOP;&lt;br /&gt;  &lt;br /&gt;END collection01;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 2: &lt;/b&gt;&lt;br /&gt;Ahora veremos como declarar un tipo complejo con &lt;i&gt;TYPE... IS RECORD&lt;/i&gt;, despues creamos un tipo anidado con el tipo creado anteriormente, una vez creado el tipo anidado, creamos una variable del tipo anidado, todo esto para poder mantener los datos que más tarde nos retornará un cursor.&lt;br /&gt;Después declaramos un tipo cursor y creamos una variable, más adelante en el cuerpo del procedimiento abrimos el cursor para un SELECT específico y cargamos la variable coleccion con los datos del cursor por medio de la clausula &lt;i&gt;FETCH &amp;lt;cursor&gt; BULK COLLECTION INTO &amp;lt;coleccion&gt;&lt;/i&gt;, al final del procedimiento solo mostramos los datos pero desde la colección.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE collection02 IS&lt;br /&gt;&lt;br /&gt;  -- Declaramos un tipo de dato complejo&lt;br /&gt;  TYPE emp_name_rec IS RECORD (&lt;br /&gt;    firstname    employees.first_name%TYPE,&lt;br /&gt;    lastname     employees.last_name%TYPE,&lt;br /&gt;    hiredate     employees.hire_date%TYPE&lt;br /&gt;  );&lt;br /&gt;    &lt;br /&gt;  -- Tipo Tabla que puede mantener información acerca de los empleados&lt;br /&gt;  TYPE EmpList_tab IS TABLE OF emp_name_rec;&lt;br /&gt;  SeniorSalespeople EmpList_tab;   &lt;br /&gt;   &lt;br /&gt;  -- Declaramos una referencia a un cursor para seleccionar un subconjunto de columnas.&lt;br /&gt;  EndCounter NUMBER := 10;&lt;br /&gt;  TYPE EmpCurTyp IS REF CURSOR;&lt;br /&gt;  emp_cv EmpCurTyp; &lt;br /&gt;   &lt;br /&gt;BEGIN&lt;br /&gt;  -- Abrimos el cursor con la sentencia SELECT indicada&lt;br /&gt;  OPEN emp_cv FOR SELECT first_name, last_name, hire_date FROM employees &lt;br /&gt;  WHERE job_id = 'SA_REP' ORDER BY hire_date;&lt;br /&gt;&lt;br /&gt;  -- Sacamos los datos del cursor y los colocamos dentro de la coleccion&lt;br /&gt;  FETCH emp_cv BULK COLLECT INTO SeniorSalespeople;&lt;br /&gt;  &lt;br /&gt;  -- Cerramos el cursor&lt;br /&gt;  CLOSE emp_cv;&lt;br /&gt;&lt;br /&gt;  -- Para este ejemplo mostramos un máximo de 10 empleados&lt;br /&gt;  IF SeniorSalespeople.LAST &gt; 0 THEN&lt;br /&gt;    IF SeniorSalespeople.LAST &lt; 10 THEN EndCounter := SeniorSalespeople.LAST; &lt;br /&gt;    END IF;&lt;br /&gt;    FOR i in 1..EndCounter LOOP&lt;br /&gt;      DBMS_OUTPUT.PUT_LINE(SeniorSalespeople(i).lastname || ', ' &lt;br /&gt;      || SeniorSalespeople(i).firstname || ', ' || SeniorSalespeople(i).hiredate);&lt;br /&gt;    END LOOP;&lt;br /&gt;  END IF;&lt;br /&gt;END collection02;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 3: &lt;/b&gt;En este ejemplo se muestra la eficiencia de la clausula &lt;i&gt;FORALL&lt;/i&gt; a diferencia de la clausula &lt;i&gt;FOR LOOP&lt;/i&gt; con tipos anidados:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE COLLECTION03 IS&lt;br /&gt;  -- Definimos des tipos de datos anidados&lt;br /&gt;  TYPE NumTab IS TABLE OF parts1.pnum%TYPE INDEX BY PLS_INTEGER;&lt;br /&gt;  TYPE NameTab IS TABLE OF parts1.pname%TYPE INDEX BY PLS_INTEGER;&lt;br /&gt;  -- Declaramos variables de los tipos definidos anteriormente&lt;br /&gt;  pnums  NumTab;&lt;br /&gt;  pnames NameTab;&lt;br /&gt;  -- Cuantas veces vamos a iterar&lt;br /&gt;  iterations CONSTANT PLS_INTEGER := 10000;&lt;br /&gt;  -- Variables que nos van a ayudar a medir el tiempo&lt;br /&gt;  t1 INTEGER;&lt;br /&gt;  t2 INTEGER;&lt;br /&gt;  t3 INTEGER;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR j IN 1..iterations LOOP  -- load index-by tables&lt;br /&gt;     pnums(j) := j;&lt;br /&gt;     pnames(j) := 'Part No. ' || TO_CHAR(j);&lt;br /&gt;  END LOOP;&lt;br /&gt;  t1 := DBMS_UTILITY.get_time;&lt;br /&gt;  FOR i IN 1..iterations LOOP  -- use FOR loop&lt;br /&gt;     INSERT INTO parts1 VALUES (pnums(i), pnames(i));&lt;br /&gt;  END LOOP;&lt;br /&gt;  t2 := DBMS_UTILITY.get_time;&lt;br /&gt;  FORALL i IN 1..iterations  -- use FORALL statement&lt;br /&gt;     INSERT INTO parts2 VALUES (pnums(i), pnames(i));&lt;br /&gt;  t3 := DBMS_UTILITY.get_time;&lt;br /&gt;  DBMS_OUTPUT.PUT_LINE('Tiempo de ejecución en segundos');&lt;br /&gt;  DBMS_OUTPUT.PUT_LINE('---------------------');&lt;br /&gt;  DBMS_OUTPUT.PUT_LINE('FOR LOOP: ' || TO_CHAR((t2 - t1)));&lt;br /&gt;  DBMS_OUTPUT.PUT_LINE('FORALL:   ' || TO_CHAR((t3 - t2)));&lt;br /&gt;  COMMIT;&lt;br /&gt;END COLLECTION03;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 4: &lt;/b&gt;Ejemplo de uso de operaciones de comparacion con operadores SET:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE COLLECTION04 IS&lt;br /&gt;&lt;br /&gt;  TYPE nested_typ IS TABLE OF NUMBER;&lt;br /&gt;    nt1 nested_typ := nested_typ(1,2,3);&lt;br /&gt;    nt2 nested_typ := nested_typ(3,2,1);&lt;br /&gt;    nt3 nested_typ := nested_typ(2,3,1,3);&lt;br /&gt;    nt4 nested_typ := nested_typ(1,2,4);&lt;br /&gt;    respuesta BOOLEAN;&lt;br /&gt;    cantidad NUMBER;&lt;br /&gt;    &lt;br /&gt;    -- Definimos un procedimiento que mostrará una cadena de caracteres y una cantidad&lt;br /&gt;    PROCEDURE imprimir(truth BOOLEAN DEFAULT NULL, quantity NUMBER DEFAULT NULL) IS&lt;br /&gt;    BEGIN&lt;br /&gt;      IF truth IS NOT NULL THEN&lt;br /&gt;        DBMS_OUTPUT.PUT_LINE(CASE truth WHEN TRUE THEN 'True' WHEN FALSE THEN 'False' END);&lt;br /&gt;      END IF;&lt;br /&gt;      IF quantity IS NOT NULL THEN&lt;br /&gt;          DBMS_OUTPUT.PUT_LINE(quantity);&lt;br /&gt;      END IF;&lt;br /&gt;    END;&lt;br /&gt;  BEGIN&lt;br /&gt;    -- La variable anidada nt1 se encuentra en el subconjunto especificado por IN?&lt;br /&gt;    -- Sí, nt1 coincide con nt2 que se encuentra en la clausula IN&lt;br /&gt;    respuesta := nt1 IN (nt2,nt3,nt4); &lt;br /&gt;    imprimir(truth =&gt; respuesta);&lt;br /&gt;    &lt;br /&gt;    -- La variable anidada nt1 es un subconjunto de la variable nt3&lt;br /&gt;    -- Sí, todos los elementos coinciden&lt;br /&gt;    respuesta := nt1 SUBMULTISET OF nt3; &lt;br /&gt;    imprimir(truth =&gt; respuesta);&lt;br /&gt;    &lt;br /&gt;    -- La variable anidada no es un subconjunto de la variable anidada nt4?&lt;br /&gt;    -- Sí, la variable NO lo es.&lt;br /&gt;    respuesta := nt1 NOT SUBMULTISET OF nt4;&lt;br /&gt;    imprimir(truth =&gt; respuesta);&lt;br /&gt;    &lt;br /&gt;    -- CARDINALITY retorna el numero de elementos de la variable anidada nt3&lt;br /&gt;    cantidad := CARDINALITY(nt3);&lt;br /&gt;    imprimir(quantity =&gt; cantidad);&lt;br /&gt;    &lt;br /&gt;    -- CARDINALITY(SET(?)) muestra el número de elementos distintos en la variable&lt;br /&gt;    cantidad := CARDINALITY(SET(nt3));&lt;br /&gt;    imprimir(quantity =&gt; cantidad);&lt;br /&gt;    &lt;br /&gt;    -- El elemento con valor 4 es un miembro de la variable nt1?&lt;br /&gt;    -- No, ese elemento no existe en la variable anidada.&lt;br /&gt;    respuesta := 4 MEMBER OF nt1;&lt;br /&gt;    imprimir(truth =&gt; respuesta);&lt;br /&gt;    &lt;br /&gt;    -- La variable nt3 es un SET, es decir no tiene duplicados?&lt;br /&gt;    -- NO, la variable tiene duplicados, por lo tanto no es un SET&lt;br /&gt;    respuesta := nt3 IS A SET;&lt;br /&gt;    imprimir(truth =&gt; respuesta);&lt;br /&gt;    &lt;br /&gt;    -- La variable nt3 no es un SET?&lt;br /&gt;    -- Sí dicha variable no es un SET porque contiene elementos duplicados.&lt;br /&gt;    respuesta := nt3 IS NOT A SET;&lt;br /&gt;    imprimir(truth =&gt; respuesta);&lt;br /&gt;    &lt;br /&gt;    -- La variable nt1 no tiene elementos?&lt;br /&gt;    -- falso, dicha variable si tiene elementos.&lt;br /&gt;    respuesta := nt1 IS EMPTY;&lt;br /&gt;    imprimir(truth =&gt; respuesta);&lt;br /&gt;   &lt;br /&gt;END COLLECTION05;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 5: &lt;/b&gt;Operaciones con los diferentes métodos implícitos de la colecciones.&lt;br /&gt; &lt;ul&gt;&lt;br /&gt;  &lt;li&gt;lista.EXIST(n), lista, es una variable de tipo anidada o varray y n es el indice de un elemento en la lista&lt;br /&gt;  &lt;li&gt;lista.COUNT, retorna el número de elementos que la lista actualmente contiene.&lt;br /&gt;  &lt;li&gt;lista.LIMIT, retorna el tamaño máximo de la tabla anidada.&lt;br /&gt;  &lt;li&gt;lista.TRIM, remueve un elemento del final de la lista, si le especificasmo un argumentoentonces removerá la cantidad especificada.&lt;br /&gt;  &lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE COLLECTION05 IS&lt;br /&gt;&lt;br /&gt;  -- Definimos un tipo anidado de enteros&lt;br /&gt;  TYPE listaNumerosType IS TABLE OF INTEGER;&lt;br /&gt;  lista listaNumerosType := listaNumerosType(1,3,5,7);&lt;br /&gt;   &lt;br /&gt;  BEGIN&lt;br /&gt;   dbms_output.put_line('Cantidad de elementos de la lista 1:'||lista.COUNT);&lt;br /&gt;   -- Borramos el segundo elemento:&lt;br /&gt;   lista.DELETE(2); &lt;br /&gt;   dbms_output.put_line('Cantidad de elementos de la lista 2:'||lista.COUNT);&lt;br /&gt;   &lt;br /&gt;   -- Si en la lista existe el elemento con indice 1 entonces hacer:&lt;br /&gt;   IF lista.EXISTS(1) THEN&lt;br /&gt;      DBMS_OUTPUT.PUT_LINE('El element #1 existe.');&lt;br /&gt;   END IF;&lt;br /&gt;   -- Si en la lista no existe el elemento con indice 2 entonces hacer&lt;br /&gt;   IF lista.EXISTS(2) = FALSE THEN&lt;br /&gt;      DBMS_OUTPUT.PUT_LINE('El elemento #2 ha sido borrado.');&lt;br /&gt;   END IF;&lt;br /&gt;   &lt;br /&gt;   -- Agregamos un par de elementos más a la lista y volvemos a hacer COUNT&lt;br /&gt;   lista.EXTEND(5);&lt;br /&gt;   lista(5) := 9;&lt;br /&gt;   dbms_output.put_line('Cantidad de elementos de la lista 3:'||lista.COUNT);&lt;br /&gt;   dbms_output.put_line('Limite de elementos de la lista :'||lista.LIMIT);&lt;br /&gt;   -- Removera 2 elementos del final de la coleccion, ojo que TRIM solo removerá uno&lt;br /&gt;   lista.TRIM(2);&lt;br /&gt;   dbms_output.put_line('Cantidad de elementos de la lista despues de TRIM:'||lista.COUNT);&lt;br /&gt;   dbms_output.put_line('Limite de elementos de la lista despues de TRIM:'||lista.LIMIT);&lt;br /&gt;   &lt;br /&gt;   -- Usando los metodos first, prior, next y last&lt;br /&gt;   dbms_output.put_line('lista.FIRST:'||lista.FIRST);&lt;br /&gt;   dbms_output.put_line('lista.LAST:'||lista.LAST);&lt;br /&gt;   dbms_output.put_line('lista.PRIOR(2):'||lista.PRIOR(2));&lt;br /&gt;   dbms_output.put_line('lista.NEXT(2):'||lista.NEXT(2));&lt;br /&gt;   &lt;br /&gt;END COLLECTION05;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-3065417254299392908?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/3065417254299392908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/05/plsql-basico2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/3065417254299392908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/3065417254299392908'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/05/plsql-basico2.html' title='PLSQL Básico2'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-8126059560066745097</id><published>2010-05-24T16:19:00.000-07:00</published><updated>2010-05-24T16:48:04.053-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plsql'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>PLSQL Básico1</title><content type='html'>&lt;div&gt;Encontré varios ejemplos de hace varios años cuando aprendía plsql, allí les dejo algunos ejemplitos, ojalá les sirvan:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 1: &lt;/b&gt;Lo unico que hace es mostrar una linea en consola.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE proc01 IS&lt;br /&gt;BEGIN&lt;br /&gt;  dbms_output.put_line('Hola mundo con los procedimientos de Oracle');&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 2: &lt;/b&gt;Igual que el anterior pero ahora la ultima línea finaliza con el nombre del procedimiento... buena practica!&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE proc02 IS&lt;br /&gt;BEGIN&lt;br /&gt;  dbms_output.put_line('Otro procedimiento pero ahora con otro texto');&lt;br /&gt;END proc02;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 3: &lt;/b&gt;Uso de la clausula %TYPE y %ROWTYPE, la clausula %TYPE sirve para asignar los tipos de datos heredados de otras variables en tiempo de ejecución lo mismo para %ROWTYPE que actua a nivel de fila&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE proc03 IS&lt;br /&gt;  v_fecha_sistema DATE;&lt;br /&gt;  v_fecha_contratacion v_fecha_sistema%TYPE;&lt;br /&gt;  v_salario employees.salary%TYPE;&lt;br /&gt;  reg_empleados employees%ROWTYPE; &lt;br /&gt;BEGIN&lt;br /&gt;  SELECT sysdate INTO v_fecha_sistema FROM dual;&lt;br /&gt;  SELECT * INTO reg_empleados FROM employees WHERE employee_id=200;&lt;br /&gt;  v_salario := reg_empleados.salary;&lt;br /&gt;  v_fecha_contratacion := reg_empleados.hire_date;&lt;br /&gt;  dbms_output.put_line('El nombre del empleado es:'||reg_empleados.first_name);&lt;br /&gt;  dbms_output.put_line('El salario del empleado es:'||v_salario);&lt;br /&gt;  dbms_output.put_line('La fecha de contratación del empleado es:'||v_fecha_contratacion);&lt;br /&gt;  dbms_output.put_line('La fecha del sistema es:'||v_fecha_sistema);&lt;br /&gt;END proc03;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 4: &lt;/b&gt;Muestra el uso de etiquetas para resolucion de nombres de variables, analiza el ámbito de la variable v_cantidad&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE proc04 IS&lt;br /&gt;BEGIN&lt;br /&gt;  &amp;lt;&amp;lt;ambito_externo&gt;&gt;&lt;br /&gt;  DECLARE &lt;br /&gt;  v_cantidad NUMBER := 100;&lt;br /&gt;  BEGIN&lt;br /&gt;    DECLARE&lt;br /&gt;    v_cantidad NUMBER := 150;&lt;br /&gt;    BEGIN&lt;br /&gt;    -- Inicio de un bloque de codigo interno&lt;br /&gt;    dbms_output.put_line('Valor de la variable interna:'||v_cantidad);&lt;br /&gt;    dbms_output.put_line('Valor de la variable externa:'||ambito_externo.v_cantidad);&lt;br /&gt;    END;&lt;br /&gt;    -- Aqui podemos continuar con los datos de la variable etiquetada externamente&lt;br /&gt;    dbms_output.put_line('Valor de la variable:'||v_cantidad);&lt;br /&gt;  END;&lt;br /&gt;END proc04;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 5: &lt;/b&gt;Podemos crear funciones dentro del procedimiento y usarlas en el mismo procedimiento.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE proc05 IS&lt;br /&gt;  &lt;br /&gt;  -- Funcion sumar:&lt;br /&gt;  FUNCTION sumar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS&lt;br /&gt;  BEGIN&lt;br /&gt;    RETURN ope1+ope2;&lt;br /&gt;  END sumar;&lt;br /&gt;  &lt;br /&gt;  -- Funcion restar:&lt;br /&gt;  FUNCTION restar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS&lt;br /&gt;  BEGIN&lt;br /&gt;    RETURN ope1-ope2;&lt;br /&gt;  END restar;&lt;br /&gt;  &lt;br /&gt;  -- Funcion multiplicar:&lt;br /&gt;  FUNCTION multiplicar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS&lt;br /&gt;  BEGIN&lt;br /&gt;    RETURN ope1*ope2;&lt;br /&gt;  END multiplicar;&lt;br /&gt;  &lt;br /&gt;  -- Funcion dividir:&lt;br /&gt;  FUNCTION dividir(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS&lt;br /&gt;  BEGIN&lt;br /&gt;    RETURN ope1/ope2;&lt;br /&gt;  END dividir;&lt;br /&gt;  &lt;br /&gt;BEGIN&lt;br /&gt;  dbms_output.put_line('Suma de 15 y 45: '||sumar(15,45));&lt;br /&gt;  dbms_output.put_line('Resta de 15 y 45: '||restar(15,45));&lt;br /&gt;  dbms_output.put_line('Multiplicacion de 15 y 45: '||multiplicar(15,45));&lt;br /&gt;  dbms_output.put_line('Division de 15 y 45: '||dividir(15,45));&lt;br /&gt;END proc05;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 6: &lt;/b&gt;Muestra el uso de las estructuras de control condicional IF-THEN e IF-THEN-ELSE&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE&lt;br /&gt;PROCEDURE proc06(vi_cantidad_minima IN INTEGER) IS&lt;br /&gt;  v_sueldo_base NUMBER := 4000;&lt;br /&gt;  v_cantidad_empleados INTEGER := 0;&lt;br /&gt;BEGIN&lt;br /&gt;  --Obtenemos la cantidad de empleados que tienen un sueldo mayor al sueldo base&lt;br /&gt;  SELECT COUNT(employee_id) INTO v_cantidad_empleados FROM employees &lt;br /&gt;  WHERE salary &gt; v_sueldo_base;&lt;br /&gt;  &lt;br /&gt;  -- Testeamos si la cantidad de empleados es mayor a una constante&lt;br /&gt;  dbms_output.put_line('La cantidad de empleados es:'||v_cantidad_empleados); &lt;br /&gt;  dbms_output.put_line('-----------------------------------------------------'); &lt;br /&gt;  dbms_output.put_line('Uso de las estructura if-then'); &lt;br /&gt;  IF v_cantidad_empleados &gt; vi_cantidad_minima THEN&lt;br /&gt;    dbms_output.put_line('La cantidad de empleados:'||v_cantidad_empleados||', ES MAYOR a la minima');  &lt;br /&gt;  END IF;&lt;br /&gt;  &lt;br /&gt;  dbms_output.put_line('Uso de las estructura if-then-else'); &lt;br /&gt;  IF v_cantidad_empleados &amp;gt; vi_cantidad_minima THEN&lt;br /&gt;    dbms_output.put_line('La cantidad de empleados:'||v_cantidad_empleados||', ES MAYOR a la minima');  &lt;br /&gt;  ELSE&lt;br /&gt;    dbms_output.put_line('La cantidad de empleados:'||v_cantidad_empleados||', NO ES MAYOR a la minima');  &lt;br /&gt;  END IF;&lt;br /&gt;  &lt;br /&gt;END proc06;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 7: &lt;/b&gt;Muestra el uso de las estructuras de control iterativas LOOP y EXIT&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE&lt;br /&gt;PROCEDURE proc07(vi_cantidad_iteraciones IN INTEGER) IS&lt;br /&gt;  v_contador1 INTEGER := 0;&lt;br /&gt;  v_contador2 INTEGER := 0;&lt;br /&gt;BEGIN&lt;br /&gt;  -- Primero con una declaración EXIT para salir de un bucle.&lt;br /&gt;  dbms_output.put_line('Iteracion con clausula EXIT');&lt;br /&gt;  LOOP&lt;br /&gt;    IF v_contador1 = vi_cantidad_iteraciones THEN&lt;br /&gt;      EXIT;&lt;br /&gt;    ELSE&lt;br /&gt;      dbms_output.put_line('Iterando con EXIT');    &lt;br /&gt;    END IF;&lt;br /&gt;    v_contador1 := v_contador1 + 1;&lt;br /&gt;  END LOOP;&lt;br /&gt;  &lt;br /&gt;  --Ahora iteramos pero con la clausula EXIT WHEN&lt;br /&gt;  v_contador1 := 0;&lt;br /&gt;  dbms_output.put_line('Iteracion con la clausula EXIT WHEN');&lt;br /&gt;  LOOP&lt;br /&gt;  v_contador1 := v_contador1 + 1;&lt;br /&gt;  dbms_output.put_line('Iterando con EXIT WHEN');    &lt;br /&gt;    EXIT WHEN v_contador1 &amp;gt;= 20;&lt;br /&gt;  END LOOP;&lt;br /&gt;  &lt;br /&gt;  --Ahora iteramos con la clausula EXIT WHEN con etiquetas&lt;br /&gt;  v_contador1 := 0;&lt;br /&gt;  v_contador2 := 0;&lt;br /&gt;  dbms_output.put_line('Iteracion con la clausula EXIT WHEN CON ETIQUETAS');&lt;br /&gt;  &amp;lt;&amp;lt;externo&gt;&gt;&lt;br /&gt;  LOOP&lt;br /&gt;    v_contador1 := v_contador1 + 1;&lt;br /&gt;    dbms_output.put_line('Iterando con EXIT WHEN');    &lt;br /&gt;    v_contador2 := 0;&lt;br /&gt;    &amp;lt;&amp;lt;interno&gt;&gt;&lt;br /&gt;    LOOP&lt;br /&gt;     v_contador2 := v_contador2 + 1;&lt;br /&gt; dbms_output.put_line('Iterando con EXIT WHEN ANIDADO');&lt;br /&gt;        EXIT externo WHEN (v_contador1 = 2 AND v_contador2 = 3);  &lt;br /&gt;        EXIT interno WHEN v_contador2 &amp;gt;= 3;&lt;br /&gt;    END LOOP;&lt;br /&gt;    EXIT externo WHEN v_contador1 &amp;gt;= 3;&lt;br /&gt;  END LOOP;&lt;br /&gt;    &lt;br /&gt;END proc07;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Ejemplo 8: &lt;/b&gt;Muestra el uso de estructuras de iteracion WHILE-LOOP-END LOOP con EXIT y etiquetas&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;CREATE OR REPLACE&lt;br /&gt;PROCEDURE proc08(vi_cantidad_iteraciones IN INTEGER) IS&lt;br /&gt;  v_contador1 INTEGER := 0;&lt;br /&gt;  v_contador2 INTEGER := 0;&lt;br /&gt;  v_contador3 INTEGER := 0;&lt;br /&gt;BEGIN  &lt;br /&gt;  --Ahora iteramos con la clausula EXIT WHEN con etiquetas&lt;br /&gt;  v_contador1 := 0;&lt;br /&gt;  v_contador2 := 0;&lt;br /&gt;  dbms_output.put_line('Iteracion con la clausula EXIT WHEN CON ETIQUETAS');&lt;br /&gt;  &amp;lt;&amp;lt;externo&gt;&gt;&lt;br /&gt;  LOOP&lt;br /&gt;    v_contador1 := v_contador1 + 1;&lt;br /&gt;    dbms_output.put_line('Iterando con EXIT WHEN');    &lt;br /&gt;    v_contador2 := 0;&lt;br /&gt;    &amp;lt;&amp;lt;interno&gt;&gt;&lt;br /&gt;    LOOP&lt;br /&gt;     v_contador2 := v_contador2 + 1;&lt;br /&gt; dbms_output.put_line('Iterando con EXIT WHEN ANIDADO'); &lt;br /&gt; v_contador3 := 0;&lt;br /&gt; WHILE (v_contador3 &amp;lt 5 ) LOOP&lt;br /&gt;   v_contador3 := v_contador3 + 1;&lt;br /&gt;   dbms_output.put_line('Iterando con EXIT WHEN ANIDADO CON WHILE-LOOP-END LOOP');&lt;br /&gt; END LOOP;&lt;br /&gt;        EXIT externo WHEN (v_contador1 = 2 AND v_contador2 = 3);  &lt;br /&gt;        EXIT interno WHEN v_contador2 &amp;gt;= 3;&lt;br /&gt;    END LOOP;&lt;br /&gt;    EXIT externo WHEN v_contador1 &amp;gt;= 3;&lt;br /&gt;  END LOOP;   &lt;br /&gt;END proc08;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-8126059560066745097?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/8126059560066745097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/05/plsql-basico1.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/8126059560066745097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/8126059560066745097'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/05/plsql-basico1.html' title='PLSQL Básico1'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-41610171848959756</id><published>2010-05-24T09:01:00.000-07:00</published><updated>2010-05-24T09:19:15.603-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testng'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>Pruebas de Software con TestNG Parte 1</title><content type='html'>TestNG es un framework de pruebas de software diseñado para simplificar un conjunto extenso de necesidades de prueba, desde pruebas unitarias(probar una clase java aislada de otras) hasta pruebas de integración(probar sistemas enteros implementados con muchas clases, muchos paquetes e incluso frameworks externos como servidores de aplicaciones). Escribir una prueba de software consiste tipicamente de un proceso en tres pasos:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Escribe la lógica de negocio de tu prueba e inserta anotaciones(por ejemplo @Test) de TestNG en tu código.&lt;br /&gt;&lt;li&gt;Agrega la información acerca de tu prueba( por ejemplo el nombre de la clase, los grupos que deseas ejecutar, etc...) en un archivo testng.xml o en un build.xml&lt;br /&gt;&lt;li&gt;Ejecuta tus pruebas de software.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Los conceptos usados por este framework son los que siguen:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Una conjunto de pruebas de software es representado por un archivo XML, este archivo contiene una o más pruebas(tests) y es definida por la etiqueta &amp;lt;suite&gt;.&lt;br /&gt;&lt;li&gt;Una prueba es representada por una etiqueta &amp;lt;test&gt; y puede contener una o más clases TestNG.&lt;br /&gt;&lt;li&gt;Una clase TestNG es una clase java que contiene al menos una anotación TestNG(@Test), es representada por la etiqueta &amp;lt;class&gt; y puede contener uno o más métodos de prueba.&lt;br /&gt;&lt;li&gt;Un método de prueba es un método java anotado con @Test en tu código fuente.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Un ejemplo de lo anterior lo podemos ver en el siguiente archivo:&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"&gt;&lt;br /&gt;&lt;suite name="service" verbose="5"&gt;&lt;br /&gt;  &lt;!-- A este conjunto de pruebas(representado por todas las etiquetas &lt;test&gt;) &lt;br /&gt;  le podemos agregar más conjuntos de pruebas --&gt;&lt;br /&gt;  &lt;suite-files&gt;&lt;br /&gt;    &lt;suite-file path="src/test/resources/testng2.xml"&gt;&lt;/suite-file&gt;&lt;br /&gt;  &lt;/suite-files&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;!-- Declaro una prueba de software, y la deshabilito con enabled="false", por default es true--&gt;&lt;br /&gt;  &lt;test name="pruebasDeSeguridad" enabled="false"&gt;&lt;br /&gt;    &lt;classes&gt;&lt;br /&gt;      &lt;class name="pe.com.slcsccy.ejemplos.spring.testng.service.TestEmpleadoService"&gt;&lt;br /&gt;        &lt;methods&gt;&lt;br /&gt;          &lt;include name="testEmpleadoService"/&gt;&lt;br /&gt;        &lt;/methods&gt;&lt;br /&gt;      &lt;/class&gt;&lt;br /&gt;     &lt;/classes&gt;&lt;br /&gt;   &lt;/test&gt;&lt;br /&gt; &lt;br /&gt;  &lt;!-- Declaro una prueba de software--&gt;&lt;br /&gt;  &lt;test name="pruebasDeValidacion" enabled="true"&gt;&lt;br /&gt;  &lt;!-- Para esta prueba de software solo se ejecutaran aquellos métodos que &lt;br /&gt;  pertenezcan al grupo 'transaccional' --&gt;&lt;br /&gt;  &lt;groups&gt;&lt;br /&gt;    &lt;run&gt;&lt;br /&gt;      &lt;include name="transaccional"  /&gt;&lt;br /&gt;    &lt;/run&gt;&lt;br /&gt;  &lt;/groups&gt;&lt;br /&gt;  &lt;!-- Declaro las clases que van a formar parte de esta prueba de software --&gt;&lt;br /&gt; &lt;classes&gt;&lt;br /&gt;   &lt;class name="pe.com.slcsccy.ejemplos.spring.testng.service.TestEmpleadoService"&gt;&lt;br /&gt;     &lt;!-- Para cada clase, declaro los métodos que van a formar parte de esta prueba de software --&gt;&lt;br /&gt;     &lt;methods&gt;&lt;br /&gt;       &lt;include name="testEmpleadoService2"/&gt;&lt;br /&gt;       &lt;!-- A los métodos les podemos asignar un valor a sus parámetros --&gt;&lt;br /&gt;       &lt;include name="testEmpleadoService3"&gt;&lt;parameter name="idEmpleado" value="7"/&gt;&lt;/include&gt;&lt;br /&gt;       &lt;include name="testEmpleadoService4"&gt;&lt;parameter name="idEmpleado" value="666"/&gt;&lt;/include&gt;&lt;br /&gt;     &lt;/methods&gt;&lt;br /&gt;   &lt;/class&gt;&lt;br /&gt; &lt;/classes&gt;&lt;br /&gt;&lt;/test&gt;&lt;br /&gt;&lt;/suite&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-41610171848959756?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/41610171848959756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/05/pruebas-unitarias-con-testng-parte-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/41610171848959756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/41610171848959756'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/05/pruebas-unitarias-con-testng-parte-1.html' title='Pruebas de Software con TestNG Parte 1'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-4203346162323349272</id><published>2010-05-12T19:31:00.000-07:00</published><updated>2010-05-19T16:54:33.299-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Spring, JUnit4 y Maven</title><content type='html'>&lt;div&gt;Esta vez vamos a ver como podemos crear nuestras pruebas unitarias mediante junit4.4 sean estas pruebas simples o transaccionales, veamos primero que es lo que vamos a probar:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ejemplo 1; Una clase calculadora simple:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.ejemplos.spring.junit4.service;&lt;br /&gt;import java.math.BigDecimal;&lt;br /&gt;import org.springframework.stereotype.Service;&lt;br /&gt;&lt;br /&gt;@Service("calculadoraService")&lt;br /&gt;public class CalculadoraServiceImpl implements CalculadoraService{&lt;br /&gt;&lt;br /&gt;public BigDecimal dividir(BigDecimal operador1, BigDecimal operador2) {&lt;br /&gt;return operador1.divide(operador2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public BigDecimal multiplicar(BigDecimal operador1, BigDecimal operador2) {&lt;br /&gt;return operador1.multiply(operador2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Long restar(Long operador1, Long operador2) {&lt;br /&gt;return operador1 - operador2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Long sumar(Long operador1, Long operador2) {&lt;br /&gt;return operador1 + operador2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;Y ahora veamos la clase de Test asociada a la calculadora:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.ejemplos.spring.junit4.service;&lt;br /&gt;import static junit.framework.Assert.assertEquals;&lt;br /&gt;import java.math.BigDecimal;&lt;br /&gt;import org.apache.commons.logging.Log;&lt;br /&gt;import org.apache.commons.logging.LogFactory;&lt;br /&gt;import org.junit.After;&lt;br /&gt;import org.junit.AfterClass;&lt;br /&gt;import org.junit.Before;&lt;br /&gt;import org.junit.BeforeClass;&lt;br /&gt;import org.junit.Ignore;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;import org.junit.runner.RunWith;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;import org.springframework.test.context.ContextConfiguration;&lt;br /&gt;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Para que está clase ejecute test unitarios, debe de estar anotada con 'RunWith'&lt;br /&gt;* cuyo valor es la clase SpringJUnit4ClassRunner, esta clase hereda de la clase Runner de junit4&lt;br /&gt;* que declara un método abstracto run que Spring implementa.&lt;br /&gt;* Para poder inyectar los beans de spring lo hacemos mediante la anotación&lt;br /&gt;* 'ContextConfiguration' que espera la ruta o classpath donde se encuentran los contenedores&lt;br /&gt;* de beans(*.xml)&lt;br /&gt;* */&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@ContextConfiguration(locations={"classpath:/ejemplos-junit4-all.xml"})&lt;br /&gt;public class CalculadoraServiceTest{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//Inyectamos el bean instanciado por Spring&lt;br /&gt;@Autowired&lt;br /&gt;private CalculadoraService calculadoraService;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//Creamos un log&lt;br /&gt;private static Log logger = LogFactory.getLog("pe.com.slcsccy.ejemplos.spring.junit4.service.CalculadoraServiceTest");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//Los métodos anotados con @BeforeClass serán ejecutados una vez por&lt;br /&gt;//cada instancia de esta clase al crearse la clase.&lt;br /&gt;@BeforeClass&lt;br /&gt;public static void inicializacionClass(){&lt;br /&gt;logger.info("Inicialización de la clase de Test...!");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Los métodos anotados con @AfterClass serán ejecutados una vez por&lt;br /&gt;//cada instancia de esta clase al terminar la ejecución de todos los métodos de prueba.&lt;br /&gt;@AfterClass&lt;br /&gt;public static void finalizacionClass(){&lt;br /&gt;logger.info("Finalización de la clase de Test...!");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//La anotación @Before pertenece a junit4.4 y le indica a la clase que el mètodo&lt;br /&gt;//anotado se ejecute antes de la ejecución de cada método de prueba&lt;br /&gt;@Before&lt;br /&gt;public void inicializacion(){&lt;br /&gt;logger.info("Inicialización de método de prueba ...!");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Si en la clase de test hubiera varios métodos anotados con @Before&lt;br /&gt;//entonces todos ellos se ejecutaran al iniciar cada método de prueba.&lt;br /&gt;@Before&lt;br /&gt;public void inicializacion2(){&lt;br /&gt;logger.info("Inicialización de método de prueba 2...!");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//La anotación @After pertenece a junit4.4 y le indica a la clase que el método&lt;br /&gt;//anotado se ejecute después de la ejecución de cada método de prueba&lt;br /&gt;@After&lt;br /&gt;public void finalizacion(){&lt;br /&gt;logger.info("Finalización de método de prueba...!");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Si en la clase de test hubiera varios métodos anotados con @After&lt;br /&gt;//entonces todos ellos se ejecutaran al terminar cada método de prueba.&lt;br /&gt;@After&lt;br /&gt;public void finalizacion2(){&lt;br /&gt;logger.info("Finalización de método de prueba 2...!");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//Método que realizará una prueba unitaria, ojo que no es necesario que&lt;br /&gt;//el nombre del método empiece con test, simplemente que esté anotado con @Test&lt;br /&gt;@Test&lt;br /&gt;public void testSumar(){&lt;br /&gt;logger.info("Inicio de test testSumar()");&lt;br /&gt;Long operador1 = 1L;&lt;br /&gt;Long operador2 = 2L;&lt;br /&gt;Long resultado = calculadoraService.sumar(operador1, operador2);&lt;br /&gt;assertEquals(3L, resultado.longValue());&lt;br /&gt;logger.info("Fin de test testSumar()");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Este tambien es un método de prueba que a diferencia del anterior no empieza con la&lt;br /&gt;//palabra test&lt;br /&gt;@Test&lt;br /&gt;public void pruebaSumar(){&lt;br /&gt;logger.info("Inicio de test pruebaSumar()");&lt;br /&gt;Long operador1 = 2L;&lt;br /&gt;Long operador2 = 3L;&lt;br /&gt;Long resultado = calculadoraService.sumar(operador1, operador2);&lt;br /&gt;assertEquals(5L, resultado.longValue());&lt;br /&gt;logger.info("Fin de test pruebaSumar()");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//Esta prueba utiliza un parámetro de la anotación @Test que indica la excepción esperada&lt;br /&gt;//por el método, si la excepción es lanzada entonces la prueba es correcta, si el método termina&lt;br /&gt;//sin lanzar una excepción entonces la prueba falla; en el siguiente caso al dividir por cero&lt;br /&gt;//el método lanza la excepción ArithmeticException que la prueba espera.&lt;br /&gt;@Test(expected=ArithmeticException.class)&lt;br /&gt;public void pruebaDivisionPorCero(){&lt;br /&gt;logger.info("Inicio de test pruebaDivisionPorCero()");&lt;br /&gt;BigDecimal operador1 = BigDecimal.TEN;&lt;br /&gt;BigDecimal operador2 = BigDecimal.ZERO;&lt;br /&gt;BigDecimal resultado = calculadoraService.dividir(operador1, operador2);&lt;br /&gt;assertEquals(5L, resultado.longValue());&lt;br /&gt;logger.info("Fin de test pruebaDivisionPorCero()");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//El otro parámetro de la anotación @Test es 'timeout' que indica que la prueba fallará&lt;br /&gt;//si la ejecución del método se demora más del valor del parámetro 'timeout' en milisegundos&lt;br /&gt;//en el ejemplo lo he colocado en 1000 milisegundos ó 1 segundo&lt;br /&gt;@Test(timeout=1000)&lt;br /&gt;public void pruebaMetodoLargo(){&lt;br /&gt;logger.info("Inicio de test pruebaMetodoLargo()");&lt;br /&gt;try {&lt;br /&gt;Thread.sleep(500);&lt;br /&gt;} catch (InterruptedException e) {&lt;br /&gt;logger.info("Hilo interrumpido en pruebaMetodoLargo()",e);&lt;br /&gt;}&lt;br /&gt;logger.info("Fin de test pruebaMetodoLargo()");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Anotando un método de prueba con la anotación @Ignore le indicará a junit4 que dicho método&lt;br /&gt;//no debe ser tomado en cuenta al momento de realizar las pruebas unitarias.&lt;br /&gt;@Ignore&lt;br /&gt;@Test(timeout=1000)&lt;br /&gt;public void pruebaMetodoLargoIgnorado(){&lt;br /&gt;logger.info("Inicio de test pruebaMetodoLargoIgnorado()");&lt;br /&gt;try {&lt;br /&gt;Thread.sleep(1000);&lt;br /&gt;} catch (InterruptedException e) {&lt;br /&gt;logger.info("Hilo interrumpido en pruebaMetodoLargoIgnorado()",e);&lt;br /&gt;}&lt;br /&gt;logger.info("Fin de test pruebaMetodoLargoIgnorado()");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ahora veamos una prueba más interesante, que tal si queremos probar operaciones con base de datos, veamos la siguiente prueba de registro de un empleado usando el esquema HR de oracle:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Ejemplo 2: Registro de empleados en una base de datos Oracle, primero veamos la clase que va a ser testeada:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.ejemplos.spring.junit4.service;&lt;br /&gt;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;import org.springframework.stereotype.Service;&lt;br /&gt;import org.springframework.transaction.annotation.Propagation;&lt;br /&gt;import org.springframework.transaction.annotation.Transactional;&lt;br /&gt;&lt;br /&gt;import pe.com.slcsccy.ejemplos.spring.junit4.dominio.beans.Employees;&lt;br /&gt;import pe.com.slcsccy.ejemplos.spring.junit4.model.dao.EmployeesDAO;&lt;br /&gt;&lt;br /&gt;@Service("empleadoService")&lt;br /&gt;@Transactional&lt;br /&gt;public class EmpleadoServiceImpl implements EmpleadoService{&lt;br /&gt;&lt;br /&gt;@Autowired&lt;br /&gt;private EmployeesDAO employeeDao;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Recordar que la propagación REQUIRED es la que se usa por default&lt;br /&gt;* la coloco para que sea más claro que si un método de prueba no inicia&lt;br /&gt;* una transacción pues los métodos de esta clase que participan en la prueba&lt;br /&gt;* sí iniciarán una transacción.&lt;br /&gt;* */&lt;br /&gt;@Override&lt;br /&gt;@Transactional(propagation=Propagation.REQUIRED)&lt;br /&gt;public void registrar(Employees empleado) {&lt;br /&gt;employeeDao.insert(empleado);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;@Transactional(readOnly=true)&lt;br /&gt;public Employees buscar(Integer idEmpleado) {&lt;br /&gt;return (Employees)employeeDao.selectByPrimaryKey(idEmpleado);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ahora la clase de Test del servicio de registro de empleados&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;package pe.com.slcsccy.ejemplos.spring.junit4.service;&lt;br /&gt;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;import org.junit.runner.RunWith;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;import org.springframework.test.annotation.NotTransactional;&lt;br /&gt;import org.springframework.test.annotation.Repeat;&lt;br /&gt;import org.springframework.test.annotation.Rollback;&lt;br /&gt;import org.springframework.test.context.ContextConfiguration;&lt;br /&gt;import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;&lt;br /&gt;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&lt;br /&gt;import org.springframework.test.context.transaction.TransactionConfiguration;&lt;br /&gt;&lt;br /&gt;import pe.com.slcsccy.ejemplos.spring.junit4.dominio.beans.Employees;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@ContextConfiguration(locations={"classpath:/ejemplos-junit4-all.xml"})&lt;br /&gt;@TransactionConfiguration(transactionManager="administradorTransaccional",defaultRollback=false)&lt;br /&gt;public class EmpleadoServiceTest extends AbstractTransactionalJUnit4SpringContextTests {&lt;br /&gt;&lt;br /&gt;@Autowired&lt;br /&gt;private EmpleadoService empleadoService;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* La anotación @Rollback la indicará a spring que los cambios que involucre el método de&lt;br /&gt;* prueba no deben de comprometerse en forma permanente en la base de datos.&lt;br /&gt;* Por otro lado la anotación @Repeat ejecutará tantas veces el método como el valor de su argumento.&lt;br /&gt;* Debemos de tener en cuenta que en la ejecución del método de prueba se crea una nueva transacción y si&lt;br /&gt;* la capa de servicios (empleadoService.*) crea otra transacción entonces la primera transacción se suspende&lt;br /&gt;* y esta ultima transacción se comprometerá si se ejecuta satisfactoriamente, por lo que el método del servicio&lt;br /&gt;* debería estar especificado de la siguiente manera:&lt;br /&gt;* @Transactional(propagation=Propagation.REQUIRED) // esto es por default, y no como:&lt;br /&gt;* @Transactional(propagation=Propagation.REQUIRES_NEW) // esto no tomaría en cuenta la anotación @Rollback&lt;br /&gt;* public void registrar(Employees empleado) {...}&lt;br /&gt;* */&lt;br /&gt;@Test&lt;br /&gt;@Rollback&lt;br /&gt;@Repeat(5)&lt;br /&gt;public void pruebaRegistroEmpleado(){&lt;br /&gt;Employees empleado1 = new Employees();&lt;br /&gt;empleado1.setEmployeeId(100001);&lt;br /&gt;empleado1.setLastName("ccacique");&lt;br /&gt;empleado1.setEmail("ccacique@sunat.gob.pe");&lt;br /&gt;empleado1.setHireDate(new Date(System.nanoTime()));&lt;br /&gt;empleado1.setJobId("IT_PROG");&lt;br /&gt;empleadoService.registrar(empleado1);&lt;br /&gt;Employees empleado2 = empleadoService.buscar(empleado1.getEmployeeId());&lt;br /&gt;logger.info("Correo del empleado en base de datos: "+empleado2.getEmail());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* La anotación @NotTransactional le indicará a spring que NO se debe de crear una transacción al iniciar&lt;br /&gt;* la ejecución del método de prueba, por default los métodos de la clase que hereden&lt;br /&gt;* de AbstractTransactionalJUnit4SpringContextTests son transaccionales.&lt;br /&gt;* */&lt;br /&gt;@Test&lt;br /&gt;@NotTransactional&lt;br /&gt;public void pruebaRegistroEmpleadoNoTransaccional(){&lt;br /&gt;Employees empleado1 = new Employees();&lt;br /&gt;empleado1.setEmployeeId(100002);&lt;br /&gt;empleado1.setLastName("ccacique");&lt;br /&gt;empleado1.setEmail("ccacique@elcacique.pe");&lt;br /&gt;empleado1.setHireDate(new Date(System.nanoTime()));&lt;br /&gt;empleado1.setJobId("IT_PROG");&lt;br /&gt;//La anotación @NotTransactional indica que todo el código&lt;br /&gt;//del método pruebaRegistroEmpleadoNoTransaccional&lt;br /&gt;//no es transaccional, pero la capa de servicios(empleadoService.registrar(empleado1)) al tener&lt;br /&gt;//su propio contexto transaccional inicia su propia transacción y compromete los cambios.&lt;br /&gt;empleadoService.registrar(empleado1);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;El proyecto utiliza el siguiente pom para resolver las dependencias del proyecto:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xsi="http://www.w3.org/2001/XMLSchema-instance" schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;&lt;br /&gt;&lt;modelversion&gt;4.0.0&lt;/modelversion&gt;&lt;br /&gt;&lt;groupid&gt;pe.com.slcsccy.ejemplos.spring&lt;/groupid&gt;&lt;br /&gt;&lt;artifactid&gt;junit4&lt;/artifactid&gt;&lt;br /&gt;&lt;packaging&gt;jar&lt;/packaging&gt;&lt;br /&gt;&lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;&lt;br /&gt;&lt;name&gt;junit4&lt;/name&gt;&lt;br /&gt;&lt;url&gt;http://maven.apache.org&lt;/url&gt;&lt;br /&gt; &lt;dependencies&gt;&lt;br /&gt;  &lt;dependency&gt;&lt;br /&gt;  &lt;groupid&gt;junit&lt;/groupid&gt;&lt;br /&gt;  &lt;artifactid&gt;junit&lt;/artifactid&gt;&lt;br /&gt;  &lt;version&gt;4.4&lt;/version&gt;&lt;br /&gt;  &lt;scope&gt;test&lt;/scope&gt;&lt;br /&gt; &lt;/dependency&gt;&lt;br /&gt; &lt;dependency&gt;&lt;br /&gt;  &lt;groupid&gt;org.springframework&lt;/groupid&gt;&lt;br /&gt;  &lt;artifactid&gt;spring-test&lt;/artifactid&gt;&lt;br /&gt;  &lt;version&gt;2.5.6&lt;/version&gt;&lt;br /&gt;  &lt;scope&gt;test&lt;/scope&gt;&lt;br /&gt; &lt;/dependency&gt;&lt;br /&gt; &lt;dependency&gt;&lt;br /&gt;  &lt;groupid&gt;com.oracle&lt;/groupid&gt;&lt;br /&gt;  &lt;artifactid&gt;ojdbc6&lt;/artifactid&gt;&lt;br /&gt;  &lt;version&gt;11.2.0.1.0&lt;/version&gt;&lt;br /&gt; &lt;/dependency&gt;&lt;br /&gt; &lt;dependency&gt;&lt;br /&gt;  &lt;groupid&gt;commons-dbcp&lt;/groupid&gt;&lt;br /&gt;  &lt;artifactid&gt;commons-dbcp&lt;/artifactid&gt;&lt;br /&gt;  &lt;version&gt;1.4&lt;/version&gt;&lt;br /&gt; &lt;/dependency&gt;&lt;br /&gt; &lt;dependency&gt;&lt;br /&gt;  &lt;groupid&gt;org.apache.ibatis&lt;/groupid&gt;&lt;br /&gt;  &lt;artifactid&gt;ibatis-sqlmap&lt;/artifactid&gt;&lt;br /&gt;  &lt;version&gt;2.3.0&lt;/version&gt;&lt;br /&gt; &lt;/dependency&gt;&lt;br /&gt; &lt;dependency&gt;&lt;br /&gt;  &lt;groupid&gt;org.springframework&lt;/groupid&gt;&lt;br /&gt;  &lt;artifactid&gt;spring&lt;/artifactid&gt;&lt;br /&gt;  &lt;version&gt;2.5.6&lt;/version&gt;&lt;br /&gt; &lt;/dependency&gt;&lt;br /&gt; &lt;dependency&gt;&lt;br /&gt;  &lt;groupid&gt;log4j&lt;/groupid&gt;&lt;br /&gt;  &lt;artifactid&gt;log4j&lt;/artifactid&gt;&lt;br /&gt;  &lt;version&gt;1.2.14&lt;/version&gt;&lt;br /&gt; &lt;/dependency&gt;&lt;br /&gt;&lt;/dependencies&gt;&lt;br /&gt;&lt;build&gt;&lt;br /&gt; &lt;plugins&gt;&lt;br /&gt;  &lt;plugin&gt;&lt;br /&gt;   &lt;groupid&gt;org.apache.maven.plugins&lt;/groupid&gt;&lt;br /&gt;   &lt;artifactid&gt;maven-surefire-plugin&lt;/artifactid&gt;&lt;br /&gt;   &lt;version&gt;2.4&lt;/version&gt;&lt;br /&gt;   &lt;configuration&gt;&lt;br /&gt;    &lt;skiptests&gt;false&lt;/skiptests&gt;&lt;br /&gt;   &lt;/configuration&gt;&lt;br /&gt;  &lt;/plugin&gt;&lt;br /&gt; &lt;/plugins&gt;&lt;br /&gt;&lt;/build&gt;&lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Las dependencias del driver de oracle las he instalado a mano en mi repositorio ya que no son públicas. Las pruebas se ejecutan con un plugin de maven que se ejecuta en la fase de test: &lt;i&gt;maven-surefire-plugin&lt;/i&gt;&lt;br /&gt;El proyecto completo te lo puedes bajar desde &lt;a href="http://sites.google.com/site/carloscacique/junit4.7z?attredirects=0&amp;amp;d=1"&gt;aquí&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-4203346162323349272?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/4203346162323349272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/05/spring-junit4-y-maven.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/4203346162323349272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/4203346162323349272'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/05/spring-junit4-y-maven.html' title='Spring, JUnit4 y Maven'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-6290793223041715247</id><published>2010-02-24T08:40:00.000-08:00</published><updated>2010-02-24T14:49:27.718-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transactional'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Implementando Transacciones distribuidas con Spring y Atomikos</title><content type='html'>&lt;div&gt;Una transacción distribuida debe entenderse como aquella transacción(con sus propiedades ACID) que llega a ejecutarse a través de multiples recursos y por recurso debe entenderse una base de datos, una cola de mensajes(JMS), etc..., en distintos hosts, por ejemplo:&lt;/div&gt;&lt;div&gt;Como aseguro que una transacción interbancaria se realice con exito, es decir retirar dinero de un banco y depositarlo en otro, teniendo en cuenta que el gestor de bases de datos del banco origen y destino son diferentes(por ejemplo mysql y postgresql) y que están en distintos hosts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Definamos entonces de una manera más simple la transacción distribuida de ejemplo:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;begin Tx.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;retirar dinero del banco origen, por ejemplo MYSQL&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;depositar dinero al banco destino por ejemplo POSTGRESQL.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;si(no excepciones)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;commit Tx.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;sino&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;rollback Tx&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;Una transacción distribuida asegura que se realicen todos los pasos dentro de la transacción de forma correcta o no se realice ninguno.&lt;/div&gt;&lt;div&gt;Por ejemplo si es que a ocurrido una excepción al depositar el dinero en el banco destino entonces la transacción distribuida debe de realizar un rollback y deshacer la acción de retiro de dinero del banco origen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo anterior se realiza mediante un mecanismo llamado commit en dos fases(two-phase commit) el cual es usado para coordinar multiples recursos durante una transacción distribuida, este mecanismo como su nombre lo indica consiste en dos fases:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Fase 1: La fase de preparación.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Fase 2: La fase de compromiso(commit).&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cuando solicitamos un commit hacia una transacción distribuida el administrador transaccional inicia el mecanismo del commit en dos fases de la siguiente manera:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En la fase uno a todos los recursos involucrados en la transacción(bases de datos, colas) se les pregunta por su estado, cada recurso puede responder con cualquiera de los 3 siguientes estados: READY, READ_ONLY y NOT_READY. Si cualquiera de los recursos responde con NOT_READY entonces la transacción entera es deshecha(se realiza un rollback). Si todos los recursos responden con READY entonces estos son  comprometidos(commit) en la segunda fase. Los recursos que responden con READ_ONLY no participan de la segunda fase.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En el ejemplo que vamos a ver a continuación usamos el administrador transaccional Atomikos ya que no requiere el uso de un servidor de aplicaciones J2EE, hay que recordar que la administración transaccional(sea local o distribuida) la proporciona el servidor de aplicaciones(jboss, weblogic, websphere, etc).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El ejemplo consiste en realizar una transacción interbancaria simple:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;1. Retiro dinero del banco BBVA estando sus cuentas en una base de datos mysql5.0&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;2. El dinero obtenido del punto 1 lo deposito al banco Scotiabank en una base de datos postgres 8.4&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El código fuente es el siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Script de base de datos tanto para mysql como para postgres:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;CREATE TABLE cuenta&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;(&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  co_cuenta char(10) NOT NULL,&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  va_monto decimal(10,2),&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  PRIMARY KEY (co_cuenta)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;insert into cuenta values('0000000001',10000);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;insert into cuenta values('0000000002',10000);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;insert into cuenta values('0000000003',10000);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;insert into cuenta values('0000000004',10000);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;insert into cuenta values('0000000005',10000);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Modificar el archivo de configuración del postgresql(postgresql.conf) para habilitar las transacciones distribuidas:&lt;/div&gt;&lt;div&gt;max_prepared_transactions = 20&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# zero disables the feature&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Crear el bean de configuración de spring(application_xa.xml):&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;       xmlns:tx="http://www.springframework.org/schema/tx"&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;       xmlns:context="http://www.springframework.org/schema/context" &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;!-- 1. Inicialización del log4j: --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        &amp;lt;property name="targetClass" value="org.springframework.util.Log4jConfigurer" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        &amp;lt;property name="targetMethod" value="initLogging" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        &amp;lt;property name="arguments"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;            &amp;lt;list&gt;&amp;lt;value&gt;C:\\logs\spring.config&amp;lt;/value&gt;&amp;lt;/list&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        &amp;lt;/property&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- 2. Declaración del dataSource para conexiones al BBVA --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;bean id="dataSourceBBVA" class="com.atomikos.jdbc.AtomikosDataSourceBean"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="uniqueResourceName" value="MYSQLDS"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="xaProperties"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;props&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;prop key="serverName"&gt;localhost&amp;lt;/prop&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;prop key="databaseName"&gt;bancoBBVA&amp;lt;/prop&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;prop key="user"&gt;root&amp;lt;/prop&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;prop key="password"&gt;jdeveloper007&amp;lt;/prop&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/props&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/property&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="minPoolSize" value="2"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="maxPoolSize" value="10"/&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- 3. Declaración del dataSource para conexiones al Scotiabank --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;bean id="dataSourceScotiabank" class="com.atomikos.jdbc.AtomikosDataSourceBean"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="uniqueResourceName" value="POSTGRESDS"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="xaDataSourceClassName" value="org.postgresql.xa.PGXADataSource"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="xaProperties"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;props&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;prop key="serverName"&gt;localhost&amp;lt;/prop&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;prop key="databaseName"&gt;bancoScotiabank&amp;lt;/prop&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;prop key="user"&gt;postgres&amp;lt;/prop&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;prop key="password"&gt;Jdeveloper007&amp;lt;/prop&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/props&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/property&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="minPoolSize" value="2"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="maxPoolSize" value="10"/&gt; &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;        &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- 4. Declaración del administrador transaccional que implementa todo el trabajo &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;transaccional, proporcionado por 'Atomikos' : --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="forceShutdown" value="true"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="startupTransactionService" value="true"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- 5. Declaración del user transaction de bajo nivel --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"&gt;&amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- 6. Al administrador transaccional JTA de spring le pasamos las referencias &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;implementadas por 'Atomikos' y no por un servidor de aplicaciones --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;bean id="administradorTransaccional" class="org.springframework.transaction.jta.JtaTransactionManager"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="transactionManager" ref="atomikosTransactionManager"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="userTransaction" ref="atomikosUserTransaction"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- 7. Habilitamos la gestión de transacciones mediante anotaciones: --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;tx:annotation-driven transaction-manager="administradorTransaccional" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;!-- 8. Declaración del mapeo sql para la capa de base de datos con iBatis --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="configLocation" value="sql-map-config.xml"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- 9. Definición de los daos de acceso a datos: --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="movimientoBBVADAO" class="pe.com.slcsccy.testspring.model.dao.MovimientoBBVADAOImpl"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="dataSource" ref="dataSourceBBVA"/&gt; &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="sqlMapClient" ref="sqlMapClient"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="movimientoScotiabankDAO" class="pe.com.slcsccy.testspring.model.dao.MovimientoScotiabankDAOImpl"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="dataSource" ref="dataSourceScotiabank"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="sqlMapClient" ref="sqlMapClient"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/bean&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- 10. Scaneo de todos los stereotipos @Service  --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;context:component-scan base-package="pe.com.slcsccy.testspring.service"/&gt;    &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/beans&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Creamos los daos y la configuración de ibatis:&lt;/div&gt;&lt;div&gt;4.1 MovimientoBBVADAO.java:&lt;/div&gt;&lt;div&gt;&lt;i&gt;package pe.com.slcsccy.testspring.model.dao;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import pe.com.slcsccy.testspring.dominio.beans.Movimiento;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public interface MovimientoBBVADAO {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;public void retirarBBVA(Movimiento cuenta);&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4.2 MovimientoBBVADAOImpl.java:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.testspring.model.dao;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.dominio.beans.Movimiento;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class MovimientoBBVADAOImpl extends SqlMapClientDaoSupport implements MovimientoBBVADAO{&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Override&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void retirarBBVA(Movimiento movimiento) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;this.getSqlMapClientTemplate().update("CUENTAS.retirarBBVA", movimiento);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4.3 MovimientoScotiabankDAO.java:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.testspring.model.dao;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.dominio.beans.Movimiento;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public interface MovimientoScotiabankDAO {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void depositarScotiabank(Movimiento movimiento)throws Exception;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4.4 MovimientoScotiabankDAOImpl.java:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.testspring.model.dao;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import java.math.BigDecimal;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.dominio.beans.Movimiento;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class MovimientoScotiabankDAOImpl extends SqlMapClientDaoSupport implements MovimientoScotiabankDAO{&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;private static final BigDecimal vaLimiteTransferencia  = BigDecimal.valueOf(2000); &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Override&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void depositarScotiabank(Movimiento movimiento) throws Exception {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;if(movimiento.getVaMonto().compareTo(vaLimiteTransferencia)&gt;0){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;throw new Exception("El monto a transferir supera el límite");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;this.getSqlMapClientTemplate().update("CUENTAS.depositarScotiabank", movimiento);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4.5 CUENTAS_SqlMap.xml&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" &gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;sqlMap namespace="CUENTAS"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;update id="retirarBBVA" parameterClass="pe.com.slcsccy.testspring.dominio.beans.Movimiento" &gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;UPDATE cuenta SET va_monto = va_monto - #vaMonto#&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;      &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;WHERE co_cuenta = #coCuentaInterbancario#&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/update&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;update id="depositarScotiabank" parameterClass="pe.com.slcsccy.testspring.dominio.beans.Movimiento" &gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;UPDATE cuenta SET va_monto = va_monto + #vaMonto#&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;      &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;WHERE co_cuenta = #coCuentaInterbancario#&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/update&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/sqlMap&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. Definimos las clases que representan al servicio:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5.1 FacadeService.java&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.testspring.service;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.dominio.beans.Movimiento;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public interface FacadeService {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void transferenciaInterbancaria(Movimiento movimiento) throws Exception;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5.2 FacadeServiceImpl.java&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.testspring.service;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.apache.log4j.Logger;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.stereotype.Service;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.transaction.annotation.Transactional;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.dominio.beans.Movimiento;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.model.dao.MovimientoBBVADAO;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.model.dao.MovimientoScotiabankDAO;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Service("facadeService")&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Transactional&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class FacadeServiceImpl implements FacadeService {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;private final Logger logger = Logger.getLogger(getClass()); &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Autowired&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;private MovimientoBBVADAO movimientoBBVADAO;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Autowired&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;private MovimientoScotiabankDAO movimientoScotiabankDAO;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Override&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Transactional(rollbackFor=Exception.class,readOnly=false)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void transferenciaInterbancaria(Movimiento movimiento) throws Exception {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;logger.info("INICIANDO TRANSFERENCIA...");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;movimientoBBVADAO.retirarBBVA(movimiento);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;movimientoScotiabankDAO.depositarScotiabank(movimiento);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;logger.info("TRANSFERENCIA FINALIZADA...");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6. Por ultimo la invocación al servicio anterior&lt;/div&gt;&lt;div&gt;6.1 Inicio2.java:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.testspring;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import java.math.BigDecimal;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.context.ApplicationContext;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.context.support.ClassPathXmlApplicationContext;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.dominio.beans.Movimiento;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.service.FacadeService;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class Inicio2 {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public static void main(String[] args) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ApplicationContext context = new ClassPathXmlApplicationContext("application_xa.xml");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;FacadeService servicioTx = (FacadeService)context.getBean("facadeService");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Movimiento movimiento = new Movimiento();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;movimiento.setCoCuentaInterbancario("0000000004");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;movimiento.setVaMonto(BigDecimal.valueOf(1500));&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;try {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;servicioTx.transferenciaInterbancaria(movimiento);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;} catch (Exception e) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;e.printStackTrace();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si quieres que se realice un rollback al movimiento colocale un monto mayor a 2000 y verás que hace un rollback a la base del BBVA tambien.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-6290793223041715247?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/6290793223041715247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/02/implementando-transacciones.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/6290793223041715247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/6290793223041715247'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/02/implementando-transacciones.html' title='Implementando Transacciones distribuidas con Spring y Atomikos'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-219654729241154692</id><published>2010-02-23T19:44:00.000-08:00</published><updated>2010-02-24T07:55:09.178-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transactional'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Implementando Transacciones con Spring y Anotaciones @Transactional Parte 3</title><content type='html'>&lt;div&gt;En esta oportunidad vamos a ver como podemos propagar las transacciones mediante spring. Se debe de entender por propagación de la transacción al mecanismo que extiende la transacción hacia otros métodos también transaccionales. En los ejemplos anteriores habíamos visto transacciones encapsuladas en un solo método, por ejemplo:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Transactional&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public class ClaseTransaccionalImpl implements ClaseTransaccional{&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; public void metodoTransaccional01(){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  dao01.ejecutar();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; }&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; public void metodoTransaccional02(){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  dao02.ejecutar();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; }&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En el código anterior cada método(invocado independientemente) inicia y cierra una transacción, pero que pasa si cualquiera de los dos métodos llama al otro como a continuación:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Transactional&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public class ClaseTransaccionalImpl implements ClaseTransaccional{&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; public void metodoTransaccional01(){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  dao01.ejecutar();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  metodoTransaccional02();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; }&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; public void metodoTransaccional02(){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  dao02.ejecutar();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; }&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora vemos que el método &lt;i&gt;metodoTransaccional01()&lt;/i&gt; invoca al método &lt;i&gt;metodoTransaccional02()&lt;/i&gt;, pero que es lo que pasa con la transacción iniciada por la invocación de &lt;i&gt;metodoTransaccional01()&lt;/i&gt;?.&lt;/div&gt;&lt;div&gt;se realiza un commit antes de la ejecución del siguiente método?&lt;/div&gt;&lt;div&gt;la transacción se suspende y se crea otra transacción por la invocación del nuevo método?&lt;/div&gt;&lt;div&gt;la transacción se extiende(PROPAGA) y la ejecución de los dos métodos se ejecutan en una sola transacción?&lt;/div&gt;&lt;div&gt;Recordando del post anterior los atributos transaccionales por default a nivel de método son los siguientes:&lt;/div&gt;&lt;div&gt;&lt;i&gt;propagation: REQUIRED.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;isolation: DEFAULT(READ_COMMITED para Oracle)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;timeout: -1&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;readOnly: false&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entonces la clase anterior definida explicitamente quedaría como:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Transactional&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public class ClaseTransaccionalImpl implements ClaseTransaccional{&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,readOnly=false)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; public void metodoTransaccional01(){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  dao01.ejecutar();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  metodoTransaccional02();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; }&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,readOnly=false)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; public void metodoTransaccional02(){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  dao02.ejecutar();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; }&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entonces que se puede deducir?, pues que la transacción se propaga hacia el método metodoTransaccional02(), ya que el atributo de propagación de la transacción es REQUIRED. Veamoslo más despacio:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Supongamos que desde una clase cualquiera ejecutamos lo siguiente:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ClaseTransaccional servicio = (ClaseTransaccional)context.getBean("claseTransaccional");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;servicio.metodoTransaccional01();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;2. Lo que hará spring es detectar que el método a sido marcado como transaccional e iniciará una transacción.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. La ejecución del método se realiza e invoca al DAO: dao01.ejecutar();&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. La ejecución del método continua y encuentra el método metodoTransaccional02() antes de ejecutar este método spring identifica que es transaccional y que su tipo de propagación es &lt;i&gt;REQUIRED&lt;/i&gt;, es decir que si ya existe un contexto transaccional entonces comparte dicho contexto, y si es que no existe el contexto transaccional entonces debe de crear una nueva transacción, para el ejemplo el método transaccional ha sido invocado en un contexto transaccional definido por &lt;i&gt;metodoTransaccional01()&lt;/i&gt; por lo que la transacción se propaga a este nuevo método.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. Si el método &lt;i&gt;metodoTransaccional02()&lt;/i&gt; termina exitosamente, es decir no lanza alguna excepción entonces el método &lt;i&gt;metodoTransaccional01()&lt;/i&gt; continua su ejecucion y si termina satisfactoriamente realiza un commit de la transacción, dando la posta al hilo que lo invocó.&lt;/div&gt;&lt;div&gt;6. Si en el punto 5 al metodo &lt;i&gt;metodoTransaccional01()&lt;/i&gt; le hemos aplicado un aspecto &lt;i&gt;afterReturning&lt;/i&gt; entonces la transacción se propagará a dicho aspecto.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-219654729241154692?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/219654729241154692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/02/implementando-transacciones-con-spring_23.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/219654729241154692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/219654729241154692'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/02/implementando-transacciones-con-spring_23.html' title='Implementando Transacciones con Spring y Anotaciones @Transactional Parte 3'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-4645148903808768831</id><published>2010-02-07T20:22:00.000-08:00</published><updated>2010-02-08T12:36:08.415-08:00</updated><title type='text'>Implementando Transacciones con Spring y Anotaciones @Transactional Parte 2</title><content type='html'>&lt;div&gt;En el siguiente post vamos a ver el manejo de los atributos transaccionales en spring, a modo de teoria recordemos dichos atributos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;isolation:&lt;/b&gt;&lt;/i&gt; El grado de aislamiento que tiene esta transacción para otras transacciones, Por ejemplo, puede esta transacción ver registros no comprometidos(uncommited) desde otras transacciones?&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;propagation:&lt;/b&gt;&lt;/i&gt; Normalmente todo el código ejecutado dentro del alcance de una transacción  será ejecutado en esa transacción.  Como vemos, existen varias opciones que especifican el comportamiento si un método es ejecutado cuando un contexto transaccional ya existe. Por ejemplo, si un contexto transaccional ya existe podemos continuar ejecutando el método en la transacción existente o podemos suspender la transacción y crear una nueva transacción. Spring ofrece todas las opciones de propagación que ofrece EJB. Dichas opciones de propagación son:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Propagation.REQUIRED:&lt;/b&gt;&lt;/i&gt; Si el método es invocado desde un contexto transaccional, entonces el método será invocado en el mismo contexto transaccional. Si el método no es invocado desde un contexto transaccional, entonces el método creará una nueva transacción e intentará comprometer(commit) la transacción cuando el método termine su ejecución.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Propagation.REQUIRES_NEW:&lt;/b&gt;&lt;/i&gt; El método siempre creará una nueva transacción cuando sea invocado y comprometerá(commit) la transacción cuando el método termine su ejecución. Si ya existe un contexto transaccional, entonces spring suspenderá la transacción existente y creará otra transacción, cuando el método termine su ejecución comprometerá la transacción y reanudará la transacción suspendida.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Propagation.NOT_SUPPORTED:&lt;/b&gt;&lt;/i&gt; Si el método es ejecutado en un contexto transaccional, entonces este contexto no es propagado a la ejecución del método, por lo que spring suspenderá el contexto transaccional y lo reanudará cuando el método termine su ejecución.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Propagation.SUPPORTS:&lt;/b&gt;&lt;/i&gt; Si ya existe un contexto transaccional, entonces el método será invocado en el mismo contexto  transaccional(igual que REQUIRED), si no existe un contexto transaccional entonces no se crea un contexto transaccional (igual que NOT_SUPPORTED)&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Propagation.MANDATORY:&lt;/b&gt;&lt;/i&gt; Este atributo obliga a la transaccion a ser ejecutada en un contexto transaccional, si es que no existe un contexto transaccional en la ejecución del método spring retorna una Excepción.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Propagation.NEVER:&lt;/b&gt;&lt;/i&gt; Este atributo obliga que la ejecución del método no sea invocado desde un contexto transaccional, de lo contrario spring retorna una excepcion.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Propagation.NESTED:&lt;/b&gt;&lt;/i&gt; (Solo en spring no en EJB), Se ejecuta dentro de una transacción anidada si un contexto transaccional existe.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;timeout:&lt;/b&gt;&lt;/i&gt; Cuanto tiempo esta transacción puede ejecutarse antes de que automáticamente se realice un rollback.&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;readOnly:&lt;/b&gt;&lt;/i&gt; Una transacción de solo lectura no modifica datos. Transacciones de solo lectura pueden ser usuales en algunos casos de optimización(por ejemplo cuando usas Hibernate).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En el siguiente ejemplo mediante spring y oracle vamos a probar los 2 niveles de aislamiento(isolation) que Oracle ofrece, el primero es &lt;i&gt;READ_COMMITED&lt;/i&gt;(por default) y el otro es el &lt;i&gt;SERIALIZABLE&lt;/i&gt;, resumiendo:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;READ_COMMITED:&lt;/b&gt;&lt;/i&gt; Nivel de aislamiento en el que una transacción solo puede ver data que a sido comprometida(commit) en la base datos. &lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;SERIALIZABLE:&lt;/b&gt;&lt;/i&gt; Este nivel de aislamiento es generalmente considerado el más restrictivo, ya que proporciona el más alto nivel de aislamiento transaccional. Una transacción SERIALIZABLE opera en un entorno donde parece que no hubieran otros usuarios modificando la data en la base de datos. Cualquier fila leída es asegurada a ser la misma así sea releída y cualquier consulta que ejecutemos es garantizada a retornar los mismos resultados durante la vida de la transacción.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Veamos un par de ejemplos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El gestor de servicios &lt;i&gt;FacadeServiceImpl.java&lt;/i&gt; ahora le he agregado 2 métodos más, un método que soporta las transacciones con un nivel de aislamiento &lt;i&gt;SERIALIZABLE&lt;/i&gt; y otra &lt;i&gt;READ_COMMITED&lt;/i&gt;, para probar el aislamiento &lt;i&gt;SERIALIZABLE&lt;/i&gt; el método &lt;i&gt;buscarEmpleado&lt;/i&gt; busca en la base un empleado con código X que al inicio de la transacción no existe, entonces duermo el hilo en ejecución por 10 segundos(Thread.sleep(1000*10);) y durante esos 10 segundos con el usuario sys(en sqlplus) ingreso un empleado con código X y comprometo(commit) la transacción, después que terminan los 10 segundos el programa intenta denuevo buscar el empleado pero tampoco lo encuentra a pesar del commit, este nivel de aislamiento es el más restrictivo:&lt;i&gt;SERIALIZABLE&lt;/i&gt;, a diferencia del &lt;i&gt;READ_COMMITED&lt;/i&gt;, este último si logra leer los datos comprometidos luego de pasados los 10 segundos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;FacadeService.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.testspring.service;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import java.util.List;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.dominio.beans.Employees;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public interface FacadeService {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void registrarEmpleados(List&lt;employees&gt; empleados);&lt;/employees&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void testNivelAislamientoSerializable(Integer idEmpleado);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void testNivelAislamientoReadCommited(Integer idEmpleado);&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;FacadeServiceImpl.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.testspring.service;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import java.util.List;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.stereotype.Service;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.transaction.annotation.Isolation;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.springframework.transaction.annotation.Transactional;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.dominio.beans.Employees;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.testspring.model.dao.EmployeesDAO;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Service("facadeService")&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Transactional&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class FacadeServiceImpl implements FacadeService {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Autowired&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;private EmployeesDAO empleadoDAO;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Override&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void registrarEmpleados(List&lt;employees&gt; empleados) {&lt;/employees&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;for(Employees e:empleados){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;empleadoDAO.insert(e);&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Override&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Transactional(isolation=Isolation.SERIALIZABLE)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void testNivelAislamientoSerializable(Integer idEmpleado) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;buscarEmpleado(idEmpleado);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Override&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Transactional(isolation=Isolation.READ_COMMITTED)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void testNivelAislamientoReadCommited(Integer idEmpleado) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;buscarEmpleado(idEmpleado);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;private void buscarEmpleado(Integer idEmpleado){&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Employees empleado = empleadoDAO.selectByPrimaryKey(idEmpleado);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;if(empleado!=null)System.out.println("Empleado 1:"+empleado.getLastName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;else System.out.println("Empleado NO Existe.");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//Duermo el programa para insertar un &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//empleado con código idEmpleado y pueda ser leído posteriormente.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//esto lo realizo con el sqlplus:&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//SYS: OPTIMUS&gt; insert into &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//hr.employees(employee_id,last_name,email,hire_date,job_id)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//values(20002,'Carlitos','algo3@algo.com',sysdate,'IT_PROG');&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//1 fila creada.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//SYS: OPTIMUS&gt; commit;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//Confirmación terminada.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;try {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Thread.sleep(1000*10);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;} catch (InterruptedException e) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;e.printStackTrace();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;empleado = empleadoDAO.selectByPrimaryKey(idEmpleado);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;if(empleado!=null)System.out.println("Empleado 2:"+empleado.getLastName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;else System.out.println("Empleado NO Existe.");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Por ultimo les muestro el log de ejecución para el nivel de aislamiento SERIALIZABLE, vean como a pesar de que creo el registro y lo comprometo(en sqlplus durante los 10 segundos), en la segunda lectura(después de los 10 segundos) Oracle aún no reconoce el registro para esta transacción, ya que esta transacción es completamente aislada de las demás:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:33 DEBUG [main] (AbstractFallbackTransactionAttributeSource.java:107) - Adding transactional method [testNivelAislamientoSerializable] with attribute [PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:33 DEBUG [main] (AbstractPlatformTransactionManager.java:371) - Creating new transaction with name [pe.com.slcsccy.testspring.service.FacadeService.testNivelAislamientoSerializable]: PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (DataSourceTransactionManager.java:202) - Acquired Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] for JDBC transaction&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (DataSourceUtils.java:170) - Changing isolation level of JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] to 8&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (DataSourceTransactionManager.java:219) - Switching JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] to manual commit&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (SqlMapClientTemplate.java:177) - Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@1786286] for iBATIS operation&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100000} Connection&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (SqlMapClientTemplate.java:194) - Obtained JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] for iBATIS operation&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100000} Preparing Statement:           select EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY,       COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID     from EMPLOYEES     where EMPLOYEE_ID = ?   &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100001} Executing Statement:           select EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY,       COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID     from EMPLOYEES     where EMPLOYEE_ID = ?   &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100001} Parameters: [20002]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100001} Types: [java.lang.Integer]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:34 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {rset-100002} ResultSet&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;b&gt;Empleado NO Existe.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (SqlMapClientTemplate.java:177) - Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@c792d4] for iBATIS operation&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100003} Connection&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (SqlMapClientTemplate.java:194) - Obtained JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] for iBATIS operation&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100003} Preparing Statement:           select EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY,       COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID     from EMPLOYEES     where EMPLOYEE_ID = ?   &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100004} Executing Statement:           select EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY,       COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID     from EMPLOYEES     where EMPLOYEE_ID = ?   &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100004} Parameters: [20002]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100004} Types: [java.lang.Integer]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {rset-100005} ResultSet&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;b&gt;Empleado NO Existe.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (AbstractPlatformTransactionManager.java:730) - Initiating transaction commit&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (DataSourceTransactionManager.java:259) - Committing JDBC transaction on Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (DataSourceUtils.java:193) - Resetting isolation level of JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] to 2&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (DataSourceTransactionManager.java:314) - Releasing JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] after transaction&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;2010-02-07 23:13:44 DEBUG [main] (DataSourceUtils.java:312) - Returning JDBC Connection to DataSource&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-4645148903808768831?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/4645148903808768831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/02/implementando-transacciones-con-spring_07.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/4645148903808768831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/4645148903808768831'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/02/implementando-transacciones-con-spring_07.html' title='Implementando Transacciones con Spring y Anotaciones @Transactional Parte 2'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-1512122880672781609</id><published>2010-02-07T08:29:00.000-08:00</published><updated>2010-02-07T15:16:39.840-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transactional'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Implementando Transacciones con Spring y Anotaciones @Transactional Parte 1</title><content type='html'>&lt;div&gt;Este post va a ser el primero de una serie el cuál estará enfocado a la implementación de transacciones mediante spring, estas implementaciones las realizaré mediantes anotaciones, con la anotación @Transactional, y en forma declarativa mediante xml y aspectos.&lt;/div&gt;&lt;div&gt;El proyecto desarrollado hace uso del esquema de ejemplo HR que viene con Oracle 10G, la capa de acceso a datos la he implementado con ibatis y el generador de clases de acceso a datos y beans a sido abator, el objetivo del proyecto es ver como spring implementa métodos transaccionales mediante anotaciones, en este primer post vamos a ver de forma simple como antes de la ejecución de un método java spring inicia una nueva transacción y como al finalizar exitosamente dicho método realiza el commit correspondiente para persistir los objetos en forma permanente en la base de datos oracle, es decir y para recordar oracle copia los datos a sus redologs y de allí cuando crea conveniente a sus datafiles, el proyecto tambien hace uso del log4j para poder visualizar la clase de spring que crea la transacción y la clase que la compromete(commit).&lt;/div&gt;&lt;div&gt;Los pasos para el desarrollo del proyecto han sido los siguientes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Generación de daos y beans mediante abator(ahora ibator) , el archivo de configuración es el siguiente:&lt;/div&gt;&lt;div&gt;&lt;b&gt;configuradorhr.xml:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!DOCTYPE abatorConfiguration&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;PUBLIC "-//Apache Software Foundation//DTD Abator for iBATIS Configuration 1.0//EN"&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"http://ibatis.apache.org/dtd/abator-config_1_0.dtd"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;abatorConfiguration&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;abatorContext id="DB2Tables" generatorSet="Java5"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@192.168.1.11:1521:optimus"&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;userId="hr" password="jdeveloper"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;classPathEntry location="ojdbc6.jar" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/jdbcConnection&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;javaTypeResolver&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="forceBigDecimals" value="false" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/javaTypeResolver&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;javaModelGenerator targetPackage="pe.com.slcsccy.testspring.dominio.beans" targetProject="."&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="enableSubPackages" value="true" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="trimStrings" value="true" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/javaModelGenerator&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;sqlMapGenerator targetPackage="pe.com.slcsccy.testspring.model.dao.ibatis" targetProject="."&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="enableSubPackages" value="true" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/sqlMapGenerator&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;daoGenerator type="SPRING" targetPackage="pe.com.slcsccy.testspring.model.dao" targetProject="."&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;property name="enableSubPackages" value="true" /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/daoGenerator&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;table tableName="countries"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;table tableName="departments"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;table tableName="employees"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;table tableName="job_history"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;table tableName="jobs"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;table tableName="locations"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;table tableName="regions"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/abatorContext&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/abatorConfiguration&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora lo único que necesitamos para crear los beans y daos es ejecutar lo siguiente:&lt;/div&gt;&lt;div&gt;&lt;i&gt;java -jar abator.jar configuradorhr.xml true&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Debes recordar también que debes de tener el driver del oracle en tu classpath para que abator te genere todas las clases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. El segundo paso a sido desarrollar la capa de servicios, el servicio lo he implementado mediante una interfaz y una clase con un solo método, que es el siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;FacadeService.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;package pe.com.slcsccy.testspring.service;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import java.util.List;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import pe.com.slcsccy.testspring.dominio.beans.Employees;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public interface FacadeService {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; public void registrarEmpleados(List empleados);&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;FacadeServiceImpl.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;package pe.com.slcsccy.testspring.service;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import java.util.List;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.stereotype.Service;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.transaction.annotation.Transactional;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import pe.com.slcsccy.testspring.dominio.beans.Employees;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import pe.com.slcsccy.testspring.model.dao.EmployeesDAO;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;@Service("facadeService")&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;@Transactional&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public class FacadeServiceImpl implements FacadeService {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; @Autowired&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; private EmployeesDAO empleadoDAO;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; @Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; public void registrarEmpleados(List empleados) {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  for(Employees e:empleados){&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;   empleadoDAO.insert(e); &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  }&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; }&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La clase FacadeServiceImpl.java primero la anotamos como un servicio estereotipado(@Service), es decir spring cuando encuentre esta anotación cargará el bean en memoria, la otra anotación @Transactional es la más importante para este post y nos indica que todos los métodos definidos en esta clase van a ser transaccionales, si la anotación @Transactional no le agregamos sus atributos, entonces los atributos que adquiere por defecto son los siguientes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;propagation: REQUIRED, es la conducta de propagación de la transacción, esto quiere decir que si el método no se ejecuta en un contexto transaccional, entonces spring crea una nueva transacción y si ya está en un contexto transaccional(por algún otro lado se inició una transacción), entonces el método se acopla a la transacción.&lt;/div&gt;&lt;div&gt;isolation: DEFAULT, el nivel de aislamiento de la transacción.&lt;/div&gt;&lt;div&gt;timeout: -1, el tiempo máximo en segundos que debe de ejecutarse la transacción.&lt;/div&gt;&lt;div&gt;read-only: false, es la transacción de solo lectura?.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algunos definiciones personalizadas de @Transactional podrían ser la siguientes:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;@Transactional(readOnly=false, propagation=Propagation.REQUIRES_NEW)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Esta definición a nivel de clase nos indica que todos los métodos no son de solo lectura(pueden hacer update insert a la base), y su nivel de propagación requiere una nueva transacción, es decir cuando la aplicación realice una invocación a un método de esta clase se deberá crear una nueva transacción.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Transactional(readOnly=true)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Esta definición a nivel de clase nos indica que todos los métodos son de solo lectura, es decir nuestros métodos no puede realizar insert o update, si lo hacen entonces spring lanza una excepción.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. El ultimo paso es la integración de los componentes en un contenedor de beans de spring:&lt;/div&gt;&lt;div&gt;&lt;b&gt;application.xml&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;xmlns:tx="http://www.springframework.org/schema/tx"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;xmlns:context="http://www.springframework.org/schema/context"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;xmlns:p="http://www.springframework.org/schema/p"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;!-- Inicialización del log4j: --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;property name="targetClass" value="org.springframework.util.Log4jConfigurer" /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;property name="targetMethod" value="initLogging" /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;property name="arguments"&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;list&gt;&amp;lt;value&gt;C:\\logs\spring.config&amp;lt;/value&gt;&amp;lt;/list&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;/property&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;/bean&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;!-- Definición del data source o fuente de datos Oracle --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;p:driverClassName="oracle.jdbc.driver.OracleDriver"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;p:url="jdbc:oracle:thin:@192.168.1.11:1521:optimus"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;p:username="hr" p:password="jdeveloper"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  &amp;lt;!-- Administrador transaccional para los objetos de acceso a datos con iBatis : --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;bean id="administradorTransaccional" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;p:dataSource-ref="dataSource"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;!-- Gestor de transacciones mediante anotaciones: --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;tx:annotation-driven transaction-manager="administradorTransaccional" /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;!-- Declaración del mapeo sql para la capa de base de datos con iBatis --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;p:configLocation="sql-map-config.xml"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;!-- Definiciòn de los daos de acceso a datos: --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;bean id="abstractDao" abstract="true" p:sqlMapClient-ref="sqlMapClient"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; p:dataSource-ref="dataSource"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;bean id="countriesDAO" class="pe.com.slcsccy.testspring.model.dao.CountriesDAOImpl" parent="abstractDao"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;bean id="departmentsDAO" class="pe.com.slcsccy.testspring.model.dao.DepartmentsDAOImpl" parent="abstractDao"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;bean id="employeesDAO" class="pe.com.slcsccy.testspring.model.dao.EmployeesDAOImpl" parent="abstractDao"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;bean id="jobHistoryDAO" class="pe.com.slcsccy.testspring.model.dao.JobHistoryDAOImpl" parent="abstractDao"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;bean id="jobsDAO" class="pe.com.slcsccy.testspring.model.dao.JobsDAOImpl" parent="abstractDao"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;bean id="locationsDAO" class="pe.com.slcsccy.testspring.model.dao.LocationsDAOImpl" parent="abstractDao"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;bean id="regionsDAO" class="pe.com.slcsccy.testspring.model.dao.RegionsDAOImpl" parent="abstractDao"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;!-- Scaneo de todos los stereotipos @Service --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &amp;lt;context:component-scan base-package="pe.com.slcsccy.testspring.service"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&amp;lt;/beans&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La ejecución del servicio que registra 3 empleados es la siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Inicio.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;package pe.com.slcsccy.testspring;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import java.util.ArrayList;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import java.util.Date;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.context.ApplicationContext;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.context.support.ClassPathXmlApplicationContext;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import pe.com.slcsccy.testspring.dominio.beans.Employees;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import pe.com.slcsccy.testspring.service.FacadeService;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public class Inicio {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; public static void main(String[] args) {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  FacadeService servicioTx = (FacadeService)context.getBean("facadeService");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  ArrayList empleados = new ArrayList() ;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  //Empleado 1.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  Employees empleado1 = new Employees();&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado1.setEmployeeId(100001);&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado1.setLastName("ccacique1");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado1.setEmail("carlos.cacique1@gmail.com");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado1.setHireDate(new Date(System.nanoTime()));&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado1.setJobId("IT_PROG");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  //Empleado 2.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  Employees empleado2 = new Employees();&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado2.setEmployeeId(100002);&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado2.setLastName("ccacique2");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado2.setEmail("carlos.cacique2@gmail.com");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado2.setHireDate(new Date(System.nanoTime()));&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado2.setJobId("IT_PROG");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  //Empleado 3.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  Employees empleado3 = new Employees();&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado3.setEmployeeId(100003);&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado3.setLastName("ccacique3");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado3.setEmail("carlos.cacique3@gmail.com");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado3.setHireDate(new Date(System.nanoTime()));&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleado3.setJobId("IT_PROG");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  //Colocamos a todos los empleados en una lista:&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleados.add(empleado1);&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleados.add(empleado2);&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  empleados.add(empleado3);&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  //Ejecutamos el servicio transaccional.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  servicioTx.registrarEmpleados(empleados);&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; }&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El log generado es el siguiente, vean como spring crea y compromete(commit) la transacción:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:10 DEBUG [main] (AbstractFallbackTransactionAttributeSource.java:107) - Adding transactional method [registrarEmpleados] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT]&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;2010-02-07 11:28:10 DEBUG [main] (AbstractPlatformTransactionManager.java:371) - Creating new transaction with name [pe.com.slcsccy.testspring.service.FacadeService.registrarEmpleados]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (DataSourceTransactionManager.java:202) - Acquired Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] for JDBC transaction&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (DataSourceTransactionManager.java:219) - Switching JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] to manual commit&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (SqlMapClientTemplate.java:177) - Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@11c0d60] for iBATIS operation&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100000} Connection&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (SqlMapClientTemplate.java:194) - Obtained JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] for iBATIS operation&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100000} Preparing Statement: insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100001} Executing Statement: insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100001} Parameters: [100001, null, ccacique1, carlos.cacique1@gmail.com, null, 2293-08-14 05:29:50.376, IT_PROG, null, null, null, null]&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100001} Types: [java.lang.Integer, null, java.lang.String, java.lang.String, null, java.sql.Timestamp, java.lang.String, null, null, null, null]&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (SqlMapClientTemplate.java:177) - Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@e4bb3c] for iBATIS operation&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100002} Connection&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (SqlMapClientTemplate.java:194) - Obtained JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] for iBATIS operation&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100002} Preparing Statement: insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100003} Executing Statement: insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100003} Parameters: [100002, null, ccacique2, carlos.cacique2@gmail.com, null, 2293-08-14 05:30:04.039, IT_PROG, null, null, null, null]&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100003} Types: [java.lang.Integer, null, java.lang.String, java.lang.String, null, java.sql.Timestamp, java.lang.String, null, null, null, null]&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (SqlMapClientTemplate.java:177) - Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@cffc79] for iBATIS operation&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100004} Connection&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (SqlMapClientTemplate.java:194) - Obtained JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] for iBATIS operation&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {conn-100004} Preparing Statement: insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100005} Executing Statement: insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100005} Parameters: [100003, null, ccacique3, carlos.cacique3@gmail.com, null, 2293-08-14 05:30:08.251, IT_PROG, null, null, null, null]&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (JakartaCommonsLoggingImpl.java:27) - {pstm-100005} Types: [java.lang.Integer, null, java.lang.String, java.lang.String, null, java.sql.Timestamp, java.lang.String, null, null, null, null]&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (AbstractPlatformTransactionManager.java:730) - Initiating transaction commit&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;2010-02-07 11:28:11 DEBUG [main] (DataSourceTransactionManager.java:259) - Committing JDBC transaction on Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver]&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (DataSourceTransactionManager.java:314) - Releasing JDBC Connection [jdbc:oracle:thin:@192.168.1.11:1521:optimus, UserName=HR, Oracle JDBC driver] after transaction&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2010-02-07 11:28:11 DEBUG [main] (DataSourceUtils.java:312) - Returning JDBC Connection to DataSource&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;El proyecto completo te lo puedes bajar desde &lt;a href="http://sites.google.com/site/carloscacique/testtx0.7z?attredirects=0&amp;amp;d=1"&gt;AQUI&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-1512122880672781609?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/1512122880672781609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/02/implementando-transacciones-con-spring.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/1512122880672781609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/1512122880672781609'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/02/implementando-transacciones-con-spring.html' title='Implementando Transacciones con Spring y Anotaciones @Transactional Parte 1'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-5660919814729677458</id><published>2010-02-05T13:50:00.000-08:00</published><updated>2010-02-05T14:51:52.019-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='aop'/><title type='text'>Creación de Aspectos con Spring e Interfaces</title><content type='html'>En los anteriores post comenté como se pueden implementar aspectos mediante anotaciones y en forma declarativa mediante xml, ahora lo vamos a hacer mediante interfaces y unas cuantas declaraciones xml. Veamos; en los aspectos declarados con el tag &lt;i&gt;&amp;lt;aspect&gt;&lt;/i&gt; la clase java era un simple javabean, en este post vamos a ver que para evitar el uso de &lt;i&gt;&amp;lt;aspect &lt;/i&gt;la clase java que define el aspecto debe de implementar al menos una interface de las siguientes para que las implementaciones  de la interface definan el aspecto en la clase, estas interfaces son las siguientes: &lt;i&gt;MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice&lt;/i&gt;, el primero de ellos me sirve si quiero que mi clase aspecte métodos antes de que estos se ejecuten, si la clase implementa &lt;i&gt;AfterReturningAdvice &lt;/i&gt;entonces el aspecto se ejecutará al finalizar satisfactoriamente la ejecución del método aspectado y finalmente la implementación de la interface &lt;i&gt;ThrowsAdvice &lt;/i&gt;capturará las posibles excepciones que el método aspectado lance. Los aspectos son los siguientes:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;AuditoriaAspectImpl.java&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;package pe.com.slcsccy.aop;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import java.lang.reflect.Method;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.aop.AfterReturningAdvice;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.aop.MethodBeforeAdvice;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.aop.ThrowsAdvice;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public class AuditoriaAspectImpl &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;implements MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice{&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;/* Aspecto llamado antes de la ejecución del método que lo ejecuta.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param metodo: método que lanza la ejecución de este aspecto.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param argumentos: Listado de argumentos del método, debemos hacer el cast.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param instancia: Instancia que contiene el método y ejecuta el aspecto.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * */&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;@Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public void before(Method metodo, Object[] argumentos, Object instancia)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;   &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;throws Throwable {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;System.out.println("Auditoria.before(..), metodo:"+metodo.getName()+",instancia:"+instancia.getClass().getCanonicalName());&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;/* Aspecto llamado cada vez que la ejecución del método termina con excepción.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param metodo: método que lanza la ejecución de este aspecto.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param argumentos: Listado de argumentos del método, debemos hacer el cast.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param instancia: Instancia que contiene el método y ejecuta el aspecto.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param exception: Instancia de la excepción que fué lanzada por el aspecto.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * */&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public void afterThrowing(Method metodo, Object[] argumentos, Object instancia, Exception exception){&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;System.out.println("Auditoria.afterThrowing(..), metodo:"+metodo.getName()+",instancia:"+instancia.getClass().getCanonicalName());&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;/* Aspecto llamado cada vez que la ejecución del método termina satisfactoriamente.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param retorno: Instancia que retorna el método.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param metodo: método que lanza la ejecución de este aspecto.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param argumentos: Listado de argumentos del método, debemos hacer el cast.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * @param instancia: Instancia que contiene el método y ejecuta el aspecto.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; * */&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;@Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public void afterReturning(Object retorno, Method metodo, Object[] argumentos,&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;   &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;Object instancia) throws Throwable {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;System.out.println("Auditoria.afterReturning(..), metodo:"+metodo.getName()+",instancia:"+instancia.getClass().getCanonicalName());&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ImpresorAspectImpl.java&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;package pe.com.slcsccy.aop;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import java.lang.reflect.Method;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.aop.AfterReturningAdvice;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.aop.MethodBeforeAdvice;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;import org.springframework.aop.ThrowsAdvice;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public class ImpresorAspectImpl implements MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice{&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;@Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public void before(Method metodo, Object[] argumentos, Object instancia)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;   &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;throws Throwable {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;System.out.println("Impresor.before(..), metodo:"+metodo.getName()+",instancia:"+instancia.getClass().getCanonicalName());&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public void afterThrowing(Method metodo, Object[] argumentos, Object instancia, Exception exception){&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;System.out.println("Impresor.afterThrowing(..), metodo:"+metodo.getName()+",instancia:"+instancia.getClass().getCanonicalName());&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;@Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;public void afterReturning(Object retorno, Method metodo, Object[] argumentos,&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;   &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;Object instancia) throws Throwable {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;System.out.println("Impresor.afterReturning(..), metodo:"+metodo.getName()+",instancia:"+instancia.getClass().getCanonicalName());&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y la configuración de spring es la siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Le indicamos a spring para que haga uso de las anotaciones @Autowired --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;context:annotation-config/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Le indicamos a spring que lea todas las clases bajo el paquete pe.com.slcsccy.service y sus&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;subpaquetes y clases, y si encuentra anotaciones estereotipadas(@Service,@Repository,@Controller) &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;a nivel de clase entonces cree beans del tipo singleton instanciandolas y disponiendolas al proyecto --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;context:component-scan base-package="pe.com.slcsccy.service"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- La definición del aspecto está embebida al implementar las interfaces *Advice  --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="impresorAspect" class="pe.com.slcsccy.aop.ImpresorAspectImpl"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="auditoriaAspect" class="pe.com.slcsccy.aop.AuditoriaAspectImpl"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Definición y configuración de los aspectos, cuando se ejecutan y su orden --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:config&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:pointcut id="pointcut" &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;expression="execution(public * pe.com.slcsccy.service..*(..))"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- El orden de ejecución de los aspectos en conforme ellos son declarados --&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:advisor id="advisor1" advice-ref="auditoriaAspect" pointcut-ref="pointcut"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:advisor id="advisor2" advice-ref="impresorAspect" pointcut-ref="pointcut"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/aop:config&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-5660919814729677458?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/5660919814729677458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/02/creacion-de-aspectos-con-spring-e.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/5660919814729677458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/5660919814729677458'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/02/creacion-de-aspectos-con-spring-e.html' title='Creación de Aspectos con Spring e Interfaces'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-8168687764226635103</id><published>2010-02-05T07:39:00.000-08:00</published><updated>2010-02-05T13:50:47.531-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='aop'/><title type='text'>Creación de Aspectos con Spring y XML</title><content type='html'>&lt;span class="Apple-style-span"  style="font-size:small;"&gt;En los dos post anteriores vimos como podemos crear aspectos mediante anotaciones y casi nada de xml más que un simple tag &lt;/span&gt;&lt;i&gt;&lt;aop:aspectj-autoproxy&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/aop:aspectj-autoproxy&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ahora vamos a seguir con los aspectos pero ya no con anotaciones sino con XML, los aspectos al no tener anotaciones que los configuren como aspectos toman al forma de simple java beans:&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;AuditoriaAspectXml.java&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.aop;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.bean.Libro;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class AuditoriaAspectXml {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void auditar(Libro libroin, Object instancia) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Aplicando Aspecto de auditoria auditar(..) @Before! con instancia:"+instancia.getClass().getCanonicalName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ImpresorAspectXml.java&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.aop;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.bean.Libro;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class ImpresorAspectXml {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void asignarAutor(Libro libroin, Object instancia) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;if(libroin!=null)libroin.setAutor("Carlos Cacique");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Aplicando Aspecto asignarAutor(..) @Before! con &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;instancia:"+instancia.getClass().getCanonicalName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;La prueba de los aspectos se dispuso de tal forma que &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;AuditoriaAspectXml.java&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; se ejecute primero y antes del aspecto &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ImpresorAspectXml.java &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y que al final se ejecute la lógica de negocio.&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Es decir el orden de ejecución debería ser el siguiente:&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;1. AuditoriaAspectXml.auditar();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2. ImpresorAspectXml.asignarAutor();&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;3. ImpresorService.imprimir()&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;La configuración mediante spring que logra lo anterior, es la siguiente:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;div&gt;&lt;i&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Le indicamos a spring para que haga uso de las anotaciones @Autowired --&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;context:annotation-config/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Le indicamos a spring que lea todas las clases bajo el paquete pe.com.slcsccy.service y sus&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;subpaquetes y clases, y si encuentra anotaciones estereotipadas(@Service,@Repository,@Controller) &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;a nivel de clase entonces cree beans del tipo singleton instanciandolas y disponiendolas al proyecto --&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;context:component-scan base-package="pe.com.slcsccy.service"/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Creamos javabeans que nos servirá como aspecto --&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="impresorAspectXml" class="pe.com.slcsccy.aop.ImpresorAspectXml"/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="auditoriaAspectXml" class="pe.com.slcsccy.aop.AuditoriaAspectXml"/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Definición y configuración de los aspector propiamente dichos --&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:config&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Configuración del primer aspecto de impresión y de orden=2, el atributo orden indica la secuencia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;de ejecución de este aspecto cuando hay un advice que dispara varios aspectos, recuerda que un advice&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;es la clase en ejecución a la que le aplicamos los aspectos, en este proyecto es el &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;bean impresorService o instancias de la clase ImpresorServicePdf.java ó ImpresorServiceExcel.java--&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:aspect ref="impresorAspectXml" order="2"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- pointcut=literalmente punto de corte, indica a qué clase se le va a aplicar el aspecto, es&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;definido mediante expresiones regulares--&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:pointcut id="pointcutImpresor" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;expression="execution(public * pe.com.slcsccy.service..*(..)) and args(libroin) and target(instancia)"/&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- aspecto, indica el nombre del método a ejecutar y el pointcut de referencia --&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:before method="asignarAutor" pointcut-ref="pointcutImpresor" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/aop:aspect&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;!-- Configuración del primer aspecto de impresión y de orden=1 --&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:aspect ref="auditoriaAspectXml" order="1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:pointcut id="pointcutAuditoria" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;expression="execution(public * pe.com.slcsccy.service..*(..)) and args(libroin) and target(instancia)" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:before method="auditar" pointcut-ref="pointcutAuditoria" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/aop:aspect&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/aop:config&gt; &lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;El proyecto completo te lo puedes bajar desde &lt;/span&gt;&lt;a href="http://sites.google.com/site/carloscacique/testaop2.7z?attredirects=0&amp;amp;d=1"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;AQUI&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-8168687764226635103?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/8168687764226635103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/02/creacion-de-aspectos-con-spring-y-xml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/8168687764226635103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/8168687764226635103'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/02/creacion-de-aspectos-con-spring-y-xml.html' title='Creación de Aspectos con Spring y XML'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-6530340002171365689</id><published>2010-02-01T09:01:00.000-08:00</published><updated>2010-02-01T09:20:00.226-08:00</updated><title type='text'>Creación de Aspectos con Spring y Anotaciones Parte 2</title><content type='html'>Ahora vamos a ver lo siguiente: como podemos ordenar la ejecución de los aspectos cuando estos aspectos se disparan ante el mismo advisor o método. En el post anterior definí un método &lt;i&gt;imprimir &lt;/i&gt;de la interface &lt;i&gt;ImpresorService&lt;/i&gt;, entonces, ¿qué es lo que pasa si tenemos más de un aspecto declarado ante la ejecución del método imprimir? ¿cuál aspecto se ejecuta primero?¿cómo podemos declarar que un aspecto se ejecute antes que otro?.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Veamos el siguiente requerimiento:&lt;/div&gt;&lt;div&gt;1. Agregar un proceso de auditoria que capture todas las ejecuciones del método &lt;i&gt;imprimir&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;El requerimiento anterior lo podemos solucionar agregando un aspecto más y definir e implementar tanto la clase como el método de auditoria con la anotación &lt;i&gt;@Order&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Solución:&lt;/div&gt;&lt;div&gt;Declaración de componentes de spring:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;context:annotation-config/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;context:component-scan base-package="pe.com.slcsccy.service"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="impresorAspect" class="pe.com.slcsccy.aop.ImpresorAspect"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;bean id="auditoriaAspect" class="pe.com.slcsccy.aop.AuditoriaAspect"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;aop:aspectj-autoproxy/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;!-- Si no usamos la anotación @Order en los aspectos entonces dichos aspectos se ejecutan en el  mismo orden en el que son declarados, para el ejemplo se ejecutaría primero los métodos de ImpresorAspect y luego AuditoriaAspect --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;context:annotation-config&gt;&lt;/context:annotation-config&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;context:component-scan package="pe.com.slcsccy.service"&gt;&lt;/context:component-scan&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;bean id="impresorAspect" class="pe.com.slcsccy.aop.ImpresorAspect"&gt;&lt;/bean&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;bean id="auditoriaAspect" class="pe.com.slcsccy.aop.AuditoriaAspect"&gt;&lt;/bean&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;aop:aspectj-autoproxy&gt;&lt;/aop:aspectj-autoproxy&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Implementación de componentes java:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;&lt;i&gt;AuditoriaAspect.java:&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;&lt;i&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;package pe.com.slcsccy.aop;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;import org.aspectj.lang.annotation.Aspect;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;import org.aspectj.lang.annotation.Before;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;import org.springframework.core.annotation.Order;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;import pe.com.slcsccy.bean.Libro;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Order(1)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Aspect&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public class AuditoriaAspect {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Order(1)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Before("execution(public * pe.com.slcsccy.service..*(..)) &amp;amp;&amp;amp; "+ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"args(libroin) &amp;amp;&amp;amp; target(instancia)")&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public void auditar(Libro libroin, Object instancia) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;System.out.println("Aplicando Aspecto de auditoria auditar(..) @Before! con instancia:"+instancia.getClass().getCanonicalName());&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;ImpresorAspect.java&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;package pe.com.slcsccy.aop;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;import org.aspectj.lang.annotation.Aspect;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;import org.aspectj.lang.annotation.Before;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;import org.springframework.core.annotation.Order;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;import pe.com.slcsccy.bean.Libro;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;@Order(2)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;@Aspect&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;public class ImpresorAspect {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;@Order(2)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;@Before("execution(public * pe.com.slcsccy.service..*(..)) &amp;amp;&amp;amp; "+ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;"args(libroin) &amp;amp;&amp;amp; target(instancia)")&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;public void asignarAutor(Libro libroin, Object instancia) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;if(libroin!=null)libroin.setAutor("Carlos Cacique");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;System.out.println("Aplicando Aspecto asignarAutor(..) @Before! con instancia:"+instancia.getClass().getCanonicalName());&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Algunas acotaciones: La anotación &lt;/span&gt;@Order&lt;span class="Apple-style-span" style="font-style: normal;"&gt; debe ser colocada tanto a nivel de clase como a nivel de método, si lo colocamos solo a nivel de método, entonces el orden de ejecución va a estar indicado por el orden en la carga de los beans:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal; font-weight: normal;"&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&amp;lt;bean id="impresorAspect" class="pe.com.slcsccy.aop.ImpresorAspect"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&amp;lt;bean id="auditoriaAspect" class="pe.com.slcsccy.aop.AuditoriaAspect"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-6530340002171365689?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/6530340002171365689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/02/creacion-de-aspectos-con-spring-y.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/6530340002171365689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/6530340002171365689'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/02/creacion-de-aspectos-con-spring-y.html' title='Creación de Aspectos con Spring y Anotaciones Parte 2'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-5106976865902307122</id><published>2010-01-31T09:05:00.001-08:00</published><updated>2010-03-17T08:33:39.125-07:00</updated><title type='text'>Creación de Aspectos con Spring y Anotaciones Parte 1</title><content type='html'>Hola denuevo, hace mucho tiempo que no posteo y esta vez quiero seguir con los aspectos en Spring, en este post supongo que ya conocen que es un aspecto, para resumirles y hablando como pragramador es un método java que se ejecuta antes, después  o antes y después de la ejecución de otro método java, esto nos permite agregar lógica a nuestra aplicación conociendo únicamente la especificación de los métodos a los cuales se les quiere aplicar un aspecto.&lt;div&gt;La aplicación de ejemplo que he desarrollado es simple: un servicio impresor de libros que tiene un método imprimir con un parámetro Libro a este método imprimir es al cual le aplico una serie de aspectos para agregar las propiedades del libro(autor, isbn y título), los anotaciones que he usado para aplicar los aspectos son: @Aspect, @Before, @After, @AfterReturning, @AfterThrowing, @Around&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La clase principal es la siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;package pe.com.slcsccy.aop;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.aspectj.lang.annotation.After;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.aspectj.lang.annotation.AfterReturning;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.aspectj.lang.annotation.AfterThrowing;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.aspectj.lang.annotation.Around;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.aspectj.lang.ProceedingJoinPoint;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.aspectj.lang.annotation.Aspect;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import org.aspectj.lang.annotation.Before;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.bean.Libro;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;import pe.com.slcsccy.service.ImpresorService;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Aspect&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public class ImpresorAspect {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/**&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * Este método se ejecuta SIEMPRE antes de cualquier ejecución &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * de cualquier método de cualquier clase del paquete pe.com.slcsccy.service y&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * que tenga un primer parámetro con nombre libroin&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * Obtengo el objeto que viene como parametro y le coloco el nombre del autor,&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * además capturo la instancia que disparó el aspecto.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Before("execution(public * pe.com.slcsccy.service..*(..)) &amp;amp;&amp;amp; "+ &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"args(libroin) &amp;amp;&amp;amp; target(instancia)")&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void asignarAutor(Libro libroin, Object instancia) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;if(libroin!=null)libroin.setAutor("Carlos Cacique");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Aplicando Aspecto asignarAutor(..) @Before! con instancia:"+instancia.getClass().getCanonicalName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/**&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * Este método se ejecuta SIEMPRE antes de la ejecución de cualquier &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * método imprimir que tenga un primer parámetro con nombre libroin de &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * cualquier clase que implementa la interface &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * pe.com.slcsccy.service.ImpresorService&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Before(value="execution(public * pe.com.slcsccy.service.ImpresorService.imprimir(..)) &amp;amp;&amp;amp; "+ &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"args(libroin) &amp;amp;&amp;amp; target(instancia)")&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void asignarISBN(Libro libroin, ImpresorService instancia) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;if(libroin!=null)libroin.setIsbn("41547848");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Aplicando Aspecto asignarISBN(..) @Before! con instancia:"+instancia.getClass().getCanonicalName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/**&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * Este método se ejecuta SOLO después de la ejecución EXITOSA de cualquier &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * método imprimir que tenga un primer parámetro con nombre libroin &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * de cualquier clase que implementa la interface &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * pe.com.slcsccy.service.ImpresorService&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@AfterReturning(value="execution(public * pe.com.slcsccy.service.ImpresorService.imprimir(..)) &amp;amp;&amp;amp; "+ &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"args(libroin) &amp;amp;&amp;amp; target(instancia)",returning="libroOut")&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void asignarTitulo(Libro libroin, Libro libroOut, ImpresorService instancia) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;libroOut.setTitulo("Ejemplo de aspectos con spring");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Aplicando Aspecto asignarTitulo(..) @AfterReturning! con instancia:"+instancia.getClass().getCanonicalName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Libro Out:"+libroOut);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/**&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * Este método se ejecuta SIEMPRE después de cualquier &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * método imprimir que tenga un primer parámetro con nombre libroin &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * de cualquier clase que implementa la interface &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * pe.com.slcsccy.service.ImpresorService&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@After(value="execution(public * pe.com.slcsccy.service.ImpresorService.imprimir(..)) &amp;amp;&amp;amp; "+ &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"args(libroin) &amp;amp;&amp;amp; target(instancia)")&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void finalizarNormal(Libro libroin, ImpresorService instancia) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Aplicando Aspecto finalizarNormal(..) @After! con instancia:"+instancia.getClass().getCanonicalName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Libro:"+libroin);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/**&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * Este método se ejecuta SIEMPRE que ocurre una excepción después de ejecutar &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * cualquier método imprimir que tenga un primer parámetro con nombre libroin&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * de cualquier clase que implementa la interface &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * pe.com.slcsccy.service.ImpresorService&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@AfterThrowing(value="execution(public * pe.com.slcsccy.service.ImpresorService.imprimir(..)) &amp;amp;&amp;amp; " +&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"args(libroin) &amp;amp;&amp;amp; target(instancia)",&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;throwing="excepcion")&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void finalizarConExcepcion(Libro libroin, ImpresorService instancia, ImpresorException excepcion) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Aplicando Aspecto finalizarConExcepcion(..) @AfterThrowing!");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Mensaje de la Excepcion en el aspecto @AfterThrowing:"+excepcion.getMessage());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/**&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * Este método se ejecuta  dos fases, la primera antes de la ejecución del método y la segunda     * cuando el método a terminado satisfactoriamente.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * @throws Throwable &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; * */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;@Around(value="execution(public * pe.com.slcsccy.service.ImpresorService.imprimir(..)) &amp;amp;&amp;amp; " +&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"args(libroin) &amp;amp;&amp;amp; target(instancia)")&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;public void logging(ProceedingJoinPoint ejecutor,Libro libroin, ImpresorService instancia) throws Throwable {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Iniciando loggin(..) @Around!");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Object retorno = ejecutor.proceed();&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;System.out.println("Finalizando loggin(..) @Around!, con retorno:"+retorno.getClass().getCanonicalName());&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La aplicación completa en eclipse la puedes descargar desde &lt;a href="http://sites.google.com/site/carloscacique/testaop.7z?attredirects=0&amp;amp;d=1"&gt;AQUI&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-5106976865902307122?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/5106976865902307122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2010/01/creacion-de-aspectos-con-spring-y.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/5106976865902307122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/5106976865902307122'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2010/01/creacion-de-aspectos-con-spring-y.html' title='Creación de Aspectos con Spring y Anotaciones Parte 1'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-377070474196566454</id><published>2009-09-05T07:45:00.000-07:00</published><updated>2009-09-15T19:53:28.815-07:00</updated><title type='text'>Spring MVC SimpleFormController</title><content type='html'>Veamos una clase que nos permitirá controlar las acciones que realicemos con los formularios de una manera más simple: &lt;i&gt;SimpleFormController&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;El caso de uso a desarrollar es uno bien simple de registro de usuarios, los requerimientos son los siguientes: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Si el actor o persona que va a registrar al usuario no está autenticada en el sistema entonces redirigirla hacia una página para que se autentique.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Solución a 1. Extensión de la clase &lt;i&gt;HandlerInterceptorAdapter&lt;/i&gt; para implementar nuestro propio interceptor de solicitudes hacia un controlador específico, en este caso el controlador es un SimpleFormController, el componente que verificará la existencia del usuario en el contexto de sesion es el Interceptor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Uso de etiquetas de formulario de spring, la libreria a usar será:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;&amp;lt;%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Ahora veamos el código:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo primero que tenemos que hacer es implementar nuestro objeto Command, en este caso el objeto command es un javabean simple:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Usuario.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;div&gt;package pe.com.slcsccy.springmvc.dominio;&lt;/div&gt;&lt;div&gt;import java.util.Date;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;public class Usuario {&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    private String codigo;&lt;/div&gt;&lt;div&gt;    private String nombres;&lt;/div&gt;&lt;div&gt;    private String apellidos;&lt;/div&gt;&lt;div&gt;    private String perfil;&lt;/div&gt;&lt;div&gt;    private String multisesion;&lt;/div&gt;&lt;div&gt;    private Boolean habilitado;&lt;/div&gt;&lt;div&gt;    private String[] aplicaciones;&lt;/div&gt;&lt;div&gt;    private String nacionalidad;&lt;/div&gt;&lt;div&gt;    private Date fechaRegistro;&lt;/div&gt;&lt;div&gt;    private Date fechaCese;&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;   //Continuan setters and getters....&lt;/i&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora vamos a crear nuestro controlador:&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UsuarioFormController.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;package pe.com.slcsccy.springmvc.controllers;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import java.text.SimpleDateFormat;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import java.util.Date;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import java.util.ArrayList;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import java.util.Map;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import javax.servlet.ServletException;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import javax.servlet.http.HttpServletRequest;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import javax.servlet.http.HttpServletResponse;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.beans.propertyeditors.CustomDateEditor;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.validation.BindException;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.bind.ServletRequestDataBinder;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.servlet.ModelAndView;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.servlet.mvc.SimpleFormController;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import pe.com.slcsccy.springmvc.dominio.Usuario;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import pe.com.slcsccy.springmvc.facade.Facade;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public class UsuarioFormController extends SimpleFormController {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private Facade facade;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    protected Object formBackingObject(HttpServletRequest request) throws Exception {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        Usuario usuario = null;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        String coUsuario = request.getParameter("coUsuario");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        if (coUsuario != null &amp;amp;&amp;amp; !coUsuario.equals("")) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            usuario  = facade.getUsuarioService().buscar(coUsuario);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        } else {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            usuario = new Usuario();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        return usuario;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/**&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Este método es llamado antes de que el formulario sea procesado, aquí&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;es donde colocamos el modelo de datos que el formulario necesita utilizar,&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;por ejemplo si vas a registrar un usuario necesitas asignarle un perfil de una&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;lista, la lista la obtenemos del DAO por aquí&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;*/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public Map referenceData(HttpServletRequest request) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Map modelo = new HashMap();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        ArrayList perfiles = facade.getPerfilService().listar();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;ArrayList aplicaciones = facade.getAplicacionService().listar();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;ArrayList nacionalidades = facade.getNacionalidadService().listar();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        modelo.put("aplicaciones", aplicaciones);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;modelo.put("perfiles", perfiles);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;modelo.put("nacionalidades", nacionalidades);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        return modelo;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /**&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * Este método permite registrar editores personalizados para ciertos campos&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * de nuestro objeto command, en este caso el objeto command es un usuario&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * el cual tiene dos campos de fechas pero de tipo Date, lo que hacemos aquí&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * es asociar los valores del request a los tipos Date con una fecha &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * personalizada, recuerda que el request.getParameter("campo") te devuelve&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * siempre un valor null o un String por lo que la transformación a Date&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * lo realiza el editor personalizado declarado aquí(Binding)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    protected void initBinder(HttpServletRequest request,&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            ServletRequestDataBinder dataBinder) throws ServletException {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /**&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * hacemos un postprocesamiento de los datos que el usuario a enviado,&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * en este caso solo le asignamos a la variable de multisesion un valor N.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * este campo de multisesion está relacionado a un checkbox y en el &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;* objeto command el campo es detipo String, si el usuario no ha marcado &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;* el checkbox entonces su valor es null, pero en la base&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * el valor solo debe ser ó N ó S. Aqui cambiamos el valor null por un más&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;* significativo.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;*/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            throws Exception {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        Usuario usuario = (Usuario)command;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        usuario.setMultisesion(usuario.getMultisesion()==null?"N":"S");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /**&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * Método que se encargará del registro del usuario en la base de datos&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * después de que las validaciones fueron exitosas(no hubo errores)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            Object command, BindException errors) throws Exception {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        Usuario usuario = (Usuario) command;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        int coError  = facade.getUsuarioService().registrar(usuario);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        if (coError == 0) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            return new ModelAndView("forms/vistaOk");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        } else {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            return new ModelAndView("forms/vistaError");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /**&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * @return the facade&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public Facade getFacade() {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        return facade;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /**&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     * @param facade the facade to set&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public void setFacade(Facade facade) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        this.facade = facade;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora declaramos la clase que validará los datos que ingrese el usuario:&lt;/div&gt;&lt;div&gt;&lt;b&gt;UsuarioValidator.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;package pe.com.slcsccy.springmvc.validators;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;import org.springframework.validation.Errors;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;import org.springframework.validation.ValidationUtils;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;import org.springframework.validation.Validator;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;import pe.com.slcsccy.springmvc.dominio.Usuario;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;public class UsuarioValidator implements Validator {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    public boolean supports(Class clase) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        return Usuario.class.isAssignableFrom(clase);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    }&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    /**&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;     * Método principal que será llamado antes de que pase por el controlador&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;     * si la lista de errores contiene al menos un elemento, regresará al&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;     * formulario&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;     */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    public void validate(Object object, Errors errores) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        Usuario usuario = (Usuario) object;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        if(usuario.getAplicaciones().length==0)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            errores.rejectValue("aplicaciones", "errores.aplicacionesReq");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        ValidationUtils.rejectIfEmpty(errores, "codigo", "errores.codigoReq","Mensaje 1");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        ValidationUtils.rejectIfEmpty(errores, "apellidos", "errores.apellidosReq","Mensaje 2");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        ValidationUtils.rejectIfEmpty(errores, "nombres", "errores.nombresReq","Mensaje 3");&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    }&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Los ultimos componentes a crear serán los interceptores:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;LoginInterceptor.java&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;package pe.com.slcsccy.springmvc.controllers;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;import javax.servlet.http.HttpServletRequest;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;import javax.servlet.http.HttpServletResponse;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;import org.springframework.web.servlet.ModelAndView;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;public class LoginInterceptor extends HandlerInterceptorAdapter {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    /*&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;     * Este método debe de asegurar que al controller solo le lleguen solicitudes&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;     * que cumplan ciertos datos del negocio, como que el usuario este autenticado por ejemplo,&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;     * recordar que el objeto handler en el argumento es el controller hacia al cual&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;     * se dirige la solicitud.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            throws Exception {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        /*Solo retornamos true...*/&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        return true;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        /*Si no queremos ir hacia la vista apropiada entonces:*/&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        /*if(true){&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            throw new ModelAndViewDefiningException(new ModelAndView("exception/noAutenticado"));&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        }else return true;*/&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    /*&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;     * Este meétodo puede hacer un postprocesamiento de la solicitud, por ejemplo&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;     * puede cambiar la vista hacia la cual el controller respondió&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            throws Exception {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Otro interceptor para que veas como funcionan en forma encadenada o en chain.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;LoginAduanasInterceptor.java&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;package pe.com.slcsccy.springmvc.controllers;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;import javax.servlet.http.HttpServletRequest;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;import javax.servlet.http.HttpServletResponse;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;import org.springframework.web.servlet.ModelAndView;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;public class LoginAduanasInterceptor extends HandlerInterceptorAdapter {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            throws Exception {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        System.out.println("Interceptor de Adunas ejecutandose en el preHandle()");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        return true;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        //Si no queremos ir hacia la vista apropiada entonces&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        /*if(true){&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            throw new ModelAndViewDefiningException(new ModelAndView("exception/noAutenticado"));&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        }else return true;*/&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    @Override&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            throws Exception {&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        System.out.println("Interceptor de Aduanas ejecutandose en el postHandle()");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Me estaba olvidando lo más importante, el formulario jsp, allí está:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;usuarioForm.jsp&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;lt;%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;lt;%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;lt;%@ page contentType="text/html" pageEncoding="UTF-8"%&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    "http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;lt;html&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    &amp;lt;head&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        &amp;lt;title&gt;Gestión de Usuarios&amp;lt;/title&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    &amp;lt;/head&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    &amp;lt;body&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        &amp;lt;form:form commandName="usuario"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Codigo: &amp;lt;form:input path="codigo" /&gt;&amp;lt;form:errors path="codigo"/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Nombres: &amp;lt;form:input path="nombres" /&gt;&amp;lt;form:errors path="nombres"/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Apellidos: &amp;lt;form:input path="apellidos" /&gt;&amp;lt;form:errors path="apellidos"/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Fecha Registro: &amp;lt;form:input path="fechaRegistro" /&gt;&amp;lt;form:errors path="fechaRegistro"/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Fecha Cese: &amp;lt;form:input path="fechaCese" /&gt;&amp;lt;form:errors path="fechaCese"/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Perfiles:&amp;lt;form:select path="perfil"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;                        &amp;lt;form:option value=""&gt;SELECCIONE&amp;lt;/form:option&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;                        &amp;lt;form:options items="${perfiles}" itemValue="coPerfil"itemLabel="dePerfil"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;                    &amp;lt;/form:select&gt;&amp;lt;form:errors path="perfil"/&gt;&amp;lt;br/&gt;&amp;lt;br/&gt;&amp;lt;br/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;!-- Ahora vamos a usar un checbox que diga si el usuario está habilitado o no--&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Habilitado:&amp;lt;form:checkbox path="habilitado"/&gt;&amp;lt;br&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            MultiSesion:&amp;lt;form:checkbox path="multisesion" value="S"/&gt;&amp;lt;br&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;!-- Ahora mostramos un conjunto de checkboxes para que seleccione la aplicación a la que tiene acceso--&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Aplicaciones:&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;form:checkboxes path="aplicaciones" items="${aplicaciones}" itemValue="coAplicacion" itemLabel="deAplicacion"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;form:errors path="aplicaciones"/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;br/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            Nacionalidad:&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;form:radiobuttons path="nacionalidad" items="${nacionalidades}" itemValue="coNacionalidad" itemLabel="deNacionalidad"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;form:errors path="nacionalidad"/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;br/&gt;&amp;lt;br/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;            &amp;lt;input type="submit" value="Registrar Usuario"/&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        &amp;lt;/form:form&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    &amp;lt;/body&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;lt;/html&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Y por ultimo la integración de todos los componentes con beans de spring que debes de colocar en el front controller &amp;lt;controller&gt;-servlet.xml&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;frontController-servlet.xml&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;...&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&amp;lt;!-- Definición de interceptores de los controladores --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;bean id="loginInterceptor" class="pe.com.slcsccy.springmvc.controllers.LoginInterceptor"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;bean id="loginAduanasInterceptor" class="pe.com.slcsccy.springmvc.controllers.LoginAduanasInterceptor"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;!-- Con este mapeador asociamos keys a urls y a ciertos controladores, mapping caleta, --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;!--&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        Declaramos un mapeador de urls seguro, es decir que pasara por dos&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        interceptores antes de que llegue al UsuarioFormController&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;bean id="handlerMappingSeguro" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="interceptors"&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            &amp;lt;list&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&amp;lt;l-- recuerda que los inteceptores son llamados en el orden en que son declarados--&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;                &amp;lt;ref bean="loginInterceptor"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;                &amp;lt;ref bean="loginAduanasInterceptor"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            &amp;lt;/list&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;/property&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="urlMap"&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            &amp;lt;map&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;                &amp;lt;entry key="/aduanas/usuarioForm.do" value-ref="usuarioFormController"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;            &amp;lt;/map&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;/property&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;/bean&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;!-- Declaramos el validador del formulario --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;bean name="usuarioValidator" class="pe.com.slcsccy.springmvc.validators.UsuarioValidator"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;!-- &lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    El bean de formulario que integrará los commands(pojos), jsps(formularios) y&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    validadores y alguna referencia a otro bean como un facade de servicios por ejemplo.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    --&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;bean id="usuarioFormController" class="pe.com.slcsccy.springmvc.controllers.UsuarioFormController"&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="facade" ref="facade"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="sessionForm" value="true"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="commandName" value="usuario"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="commandClass" value="pe.com.slcsccy.springmvc.dominio.Usuario"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="formView" value="forms/usuarioForm"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="successView" value="forms/usuarioRegistrado"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;property name="validator" ref="usuarioValidator"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;/bean&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;...&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Eso es todo por el momento, animate a hacer tu propia aplicación con todos los componentes, en el próximo post hablaré sobre como podemos crear componentes que permitan descargar hacia Excel y Pdf mediante poi e itext integrado con spring.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-377070474196566454?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/377070474196566454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2009/09/spring-mvc-simpleformcontroller.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/377070474196566454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/377070474196566454'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2009/09/spring-mvc-simpleformcontroller.html' title='Spring MVC SimpleFormController'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-3213542563439860925</id><published>2009-08-22T21:57:00.000-07:00</published><updated>2009-08-23T10:08:02.218-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring mvc'/><title type='text'>Spring MVC Implementando Internacionalización</title><content type='html'>La internacionalización de tu aplicación consiste en hacerla accesible no solo para las personas localizadas en un país(con un determinado lenguaje, como el español para nosotros), sino tambien para aquellas personas en otros países(como Inglaterra, Francia ó Italia, que leen inglés, francés, italiano) La internacionalización consiste básicamente en que el texto que muestra tu aplicación en un determinado lenguaje pueda ser visto en otro lenguaje si cambiar nada de código, es decir si desde Italia accedo a tu aplicación entonces todo el texto tiene que estar en italiano, si desde Inglaterra accedo a tu aplicación entonces todo el texto tiene que estar en inglés. Pero, ¿como implementamos esto? ¿cuál es la mejor manera?. A veces cuando no se tiene un conocimiento profundo de la tecnología realizamos la aplicación sin tener en cuenta este punto osea implementamos todas los texto solo en nuestro lenguaje, para muestra un ejemplo:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Si tenemos un pedaz de código en una página jsp como el siguiente:&lt;/div&gt;&lt;div&gt;&lt;i&gt;Usuario: &amp;lt;input type="text" name="usuario"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Clave: &amp;lt;input type="text" name="clave"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-Entonces el texto(ó etiquetas) &lt;i&gt;Usuario &lt;/i&gt;y&lt;i&gt; &lt;/i&gt;&lt;i&gt;Clave &lt;/i&gt;siempre van a aparecer en español para cualquier tipo de usuario(sea inglés, italiano, alemán...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La solución está en asociar claves a las etiquetas y centralizar esta asociación en un archivo de propiedades, teniendo un archivo por cada lenguaje que desee soportar nuestra aplicación. El código jsp anterior se puede cambiar por lo siguiente:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;spring:message code="etiq.usuario"/&gt;&amp;lt;input type="text" name="usuario"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;spring:message code="etiq.clave"/&gt;&amp;lt;input type="text" name="clave"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Y el archivo de propiedades para tres idiomas sería:&lt;/div&gt;&lt;div&gt;1. Para soporte español(por defecto cuando el sufijo no es especificado) &lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;mensajes.properties&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;etiq.titulo = Spring Framework&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;div&gt;etiq.usuario = Usuario&lt;/div&gt;&lt;div&gt;etiq.clave = Clave&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;div&gt;2. Para soporte inglés&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;mensajes_EN.properties&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;etiq.titulo = Spring Framework&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;div&gt;etiq.usuario = User&lt;/div&gt;&lt;div&gt;etiq.clave = Password&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;div&gt;3. Para soporte italiano&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;mensajes_IT.properties&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;etiq.titulo = Spring Framework&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;div&gt;etiq.usuario = Utente&lt;/div&gt;&lt;div&gt;etiq.clave = Chiave&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Cuando la aplicación sea invocada esta va a detectar el lenguaje del navegador y va a utilizar el archivo de propiedades apropiado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bueno, ahora veamos como Spring soporta todo este contexto de internacionalización. A diferencia de los post anteriores ahora vamos a agregar a la aplicación un contenedor de beans(un ApplicationContext.xml) adicionando al descriptor de despliegue lo siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;!--&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    Una variable de contexto que tendrá como valor el archivo de configuración del contenedor de beans.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    --&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;context-param&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;param-name&gt;contextConfigLocation&amp;lt;/param-name&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;param-value&gt;/WEB-INF/applicationContext.xml&amp;lt;/param-value&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/context-param&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;!-- &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    Un listener de contexto que usará el archivo anterior para instanciar todos los beans que contiene&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    --&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;listener&gt;&amp;lt;listener-class&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;org.springframework.web.context.ContextLoaderListener&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/listener-class&gt;&amp;lt;/listener&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Una vez declarado la ruta del contenedor de beans ahora lo definimos:&lt;/div&gt;&lt;div&gt;&lt;b&gt;ApplicationContext.xml&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;!--&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;      Declaración del bean que obtendrá el archivo y que a su vez lo hará disponible al resto de la aplicación(ya no tenemos que colocar los mensajes en duro) ahora podemos centralizar estos mensajes en un archivo mensajes.properties, este archivo debe de estar en la raiz de tu classpath, osea /WEB-INF/classes&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    --&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;property name="basename"&gt;&amp;lt;value&gt;mensajes&amp;lt;/value&gt;&amp;lt;/property&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/bean&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/beans&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Los archivos de propiedades con los textos en cada idioma debemos de colocarlos en la raiz del classpath, es decir en &lt;i&gt;/WEB-INF/classes&lt;/i&gt; . Esta carpeta quedaría como:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/WEB-INF/classes/mensajes.properties&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/WEB-INF/classes/mensajes_EN.properties&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/WEB-INF/classes/mensajes_IT.properties&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una vez configurada la aplicación procedemos a probarla con un archivo jsp:&lt;/div&gt;&lt;div&gt;&lt;b&gt;index.jsp&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;&amp;lt;%@taglib prefix="spring" uri="http://www.springframework.org/tags" %&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;html&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;head&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            &amp;lt;title&gt;&amp;lt;spring:message code="etiq.titulo"/&gt;&amp;lt;/title&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/head&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;body&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;form action="/usuario/procesar.do" method="POST"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            &amp;lt;spring:message code="etiq.usuario"/&gt;&amp;lt;input name="usuario" type="text"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;spring:message code="etiq.clave"/&gt;&amp;lt;input name="clave" type="text"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;/form&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/body&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/html&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para finalizar, este tipo de diseño simplifica el desarrollo y mantenimiento de tu aplicación, ya no tienes que estar buscando en las miles de líneas de código en tu aplicación, todos los mensajes y textos los centralizas en un archivo de mensajes y si quieres cambiar algo, pues solo lo haces allí.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-3213542563439860925?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/3213542563439860925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2009/08/spring-mvc-implementando.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/3213542563439860925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/3213542563439860925'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2009/08/spring-mvc-implementando.html' title='Spring MVC Implementando Internacionalización'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-1153973597950297627</id><published>2009-08-22T13:24:00.001-07:00</published><updated>2009-08-22T14:29:38.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring MVC implementando la interface Controller</title><content type='html'>En los 2 post anteriores hemos visto como podemos implementar un controlador(la C en MVC) mediante anotaciones, para aquellos a quienes no les guste este tipo de implementación pues hay una forma un poco más extensa y un tanto vieja, esta forma es mediante la implementación de la interface Controller, allí las va el código:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1.&lt;/b&gt; En el Front Controller(&lt;algo&gt;-servlet.xml) de tu aplicación declara el siguiente bean:&lt;/algo&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt; &lt;i&gt; &amp;lt;!--&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     El siguiente bean mapeará las solicitudes /login/procesar.do hacia el controlador pe.com.slcsccy.springmvc.controllers.LoginController, estas solicitudes serán procesadas por el metodo: handleRequest(HttpServletRequest,HttpServletResponse) que deacuerdo al procesamiento ó lógica de negocio retornará hacia la vista apropiada&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    --&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;bean name="/login/procesar.do" class="pe.com.slcsccy.springmvc.controllers.LoginController"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;property name="vistaOk" value="iniciar"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;property name="vistaError" value="error"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/bean&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2.&lt;/b&gt; Crea una clase que implemente la interface &lt;i&gt;Controller &lt;/i&gt;y agregale la lógica de negocia que tu quieras:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;package pe.com.slcsccy.springmvc.controllers;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import java.util.HashMap;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import java.util.Map;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import javax.servlet.http.HttpServletRequest;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import javax.servlet.http.HttpServletResponse;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.servlet.ModelAndView;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.servlet.mvc.Controller;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import pe.com.slcsccy.springmvc.dominio.Usuario;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public class LoginController implements Controller {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String vistaOk;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String vistaError;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /*&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     Método definido en la interfaz Controller e implementado aquí para dar soporte a las solicitudes cuyo patrón URL está declarado en el Front Controller(frontController-servlet.xml)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        System.out.println("VistaOk:"+getVistaOk());&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        System.out.println("VistaError:"+getVistaError());&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        String usuarioRequest = request.getParameter("usuario");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        if ("ccacique".equals(usuarioRequest)) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            /* Creamos los datos que supuestamente los obtenemos con un Service */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            Map datosLogin = new HashMap();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            Usuario usuario = new Usuario();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            usuario.setNombres("Carlos Alberto");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            usuario.setApellidos("Cacique Yupanqui");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            usuario.setCodigo("ccacique");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            datosLogin.put("usuario", usuario);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            /* El constructor de ModelAndView recibe como parametros el nombre de la&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;               vista hacia la cual vamos a responder y el modelo de datos que hemos obtenido.*/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            return new ModelAndView(getVistaOk(), datosLogin);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        } else {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            Map datosError = new HashMap();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            datosError.put("mensaje", "Usuario incorrecto");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            return new ModelAndView(getVistaError(), datosError);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public String getVistaOk() {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        return vistaOk;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public void setVistaOk(String vistaOk) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        this.vistaOk = vistaOk;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public String getVistaError() {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        return vistaError;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public void setVistaError(String vistaError) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        this.vistaError = vistaError;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;3.&lt;/b&gt; Define las vistas, para el caso solo 2 páginas jsp; error.jsp e iniciar.jsp&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;error.jsp:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&amp;lt;%@ page contentType="text/html" %&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&amp;lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&amp;lt;html&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;head&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;title&gt;Pagina de Error&amp;lt;/title&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;/head&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;body&gt;PAGINA DE ERROR:&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;        &amp;lt;c:out value="${mensaje}"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;    &amp;lt;/body&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&amp;lt;/html&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;iniciar.jsp&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;div&gt;&amp;lt;%@ page contentType="text/html" %&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;html&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;head&gt;&amp;lt;title&gt;Aplicación J2EE&amp;lt;/title&gt;&amp;lt;/head&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;body&gt;Bienvenido: &amp;lt;c:out value="${usuario.apellidos}"/&gt;,&amp;lt;c:out value="${usuario.nombres}"/&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;/body&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/html&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Comparando la forma de implementación de Controllers ya sea mediante anotaciones(&lt;i&gt;@Controller&lt;/i&gt;) o mediante la implementación de la interfaz &lt;i&gt;Controller(&lt;/i&gt;como vimos en este post), pues la tendencia es ir hacia lo que es anotaciones, con las anotaciones podemos prescindir de declarar los controllers en el FrontController, lo unico que tenemos que hacer es escanear el contexto del contenedor en busca de estereotipos y es el contenedor quien se encargará de detectar e instanciar los controllers adecuados, recuerda que el escaneo lo realizamos con la siguiente declaración: &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&amp;lt;context:component-scan base-package="pe.com.slcsccy.springmvc.controllers"/&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Si aún así pues no te animas por las anotaciones pues en los siguientes post vamos a ver algo más de controllers más detallados y especificos para un problema particular.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-1153973597950297627?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/1153973597950297627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2009/08/spring-mvc-implementando-la-interface.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/1153973597950297627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/1153973597950297627'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2009/08/spring-mvc-implementando-la-interface.html' title='Spring MVC implementando la interface Controller'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-2775991369569978804</id><published>2009-08-20T23:03:00.000-07:00</published><updated>2009-08-21T19:47:46.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='spring basico'/><title type='text'>Spring MVC Usando @Controller y Formularios</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;En el post anterior vimos como podemos usar el estereotipo @Controller para mapear las solicitudes con la anotación @RequestMapping a métodos, esta vez vamos a ver como podemos usar formularios, validarlos y hacer uso de una clase estereotipada(denuevo @Controller) que controle y mapee adecuadamente las solicitudes que se hagan con el formulario, para esto la configuración de la aplicación no ha cambiado(no he modificado web.xml ni frontController-servlet.xml del post anterior y que voy a reutilizar).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Veamos el primer archivo cliente:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;a href="${pageContext.request.contextPath}/forms/usuario.do"&gt;Registrar Usuario&amp;lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La línea anterior la podemos colocar en cualquier archivo jsp y lo que hará es solicitar al controlador(UsuarioController.java) que me retorne la página donde voy a registrar al usuario, la clase estereotipada &lt;b&gt;UsuarioController.java&lt;/b&gt; es la siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;package pe.com.slcsccy.springmvc.controllers;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.stereotype.Controller;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.ui.Model;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.validation.BindingResult;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.bind.annotation.ModelAttribute;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.bind.annotation.RequestMapping;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.bind.annotation.RequestMethod;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.bind.annotation.SessionAttributes;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.bind.support.SessionStatus;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import pe.com.slcsccy.springmvc.dominio.Usuario;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import pe.com.slcsccy.springmvc.validacion.UsuarioValidador;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;@Controller&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;@RequestMapping("/forms/usuario.do")&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;@SessionAttributes(types = Usuario.class)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public class UsuarioController {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/**&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Este método es el que se ejecutará cuando las solicitudes tengan el patrón URL de la forma /forms/usuario.do y sean del tipo GET, es decir desde un link a href, desde un URL, desde javascript o cuando en el formulario html el atributo method sea GET o no esté especificado.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;*/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;@RequestMapping(method = RequestMethod.GET)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; public String inicializarFormulario(Model model) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/*&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Al formulario le enviamos los datos por default de un usuario, este método actua como el inicializador o constructor del formulario&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;*/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Usuario usuario = new Usuario();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;  model.addAttribute(usuario);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;  return "forms/usuario";&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/*&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Este método será ejecutado solo cuando el patrón URL del formulario sea /forms/usuario.do y además el método del formulario que envía los datos solo sea POST, el detalle de los argumentos de los métodos es el siguiente:&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;@param @ModelAttribute contiene todos los datos del usuario que ha sido enviado desde el formulario&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;@param BindingResult, BindinResult es una interface, lo que hace Spring es crear un objeto que implementa esta interface,especificamente Spring implementa org.springframework.validation.BeanPropertyBindingResult este objeto se enlazará el objeto usuario enviado para permitir realizar las validaciones necesarias, extiende de Errors.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;@param SessionStatus, objeto que determina si el PROCESAMIENTO de la session a sido completado o no, podemos usar este objeto para indicar a la aplicación que el PROCESAMIENTO de la session ha sido completado y que los atributos en él ya no son necesarios.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;*/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; @RequestMapping(method = RequestMethod.POST)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; public String procesarFormulario(@ModelAttribute Usuario usuario,&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;BindingResult resultado, SessionStatus estado) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/* Validamos los datos del usuario */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;new UsuarioValidador().validar(usuario, resultado);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/* Si no hay errores limpiamos la session y redireccionamos */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;if(!resultado.hasErrors()){&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/* Limpiamos los objetos de session para este procesamiento*/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;estado.setComplete();&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/* redireccionamos al método inicializarFormulario */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;return "redirect:usuario.do";&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;/* Si hay errores los mostramos en el formulario */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;return "forms/usuario";&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La clase anterior usa un validador que es el siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UsuarioValidador.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;package pe.com.slcsccy.springmvc.validacion;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.util.StringUtils;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.validation.Errors;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import pe.com.slcsccy.springmvc.dominio.Usuario;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public class UsuarioValidador {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    public void validar(Usuario usuario, Errors errors) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        if (!StringUtils.hasLength(usuario.getCodigo())) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            errors.rejectValue("codigo", "required", "required");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        if (!StringUtils.hasLength(usuario.getNombres())) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            errors.rejectValue("nombres", "required", "required");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        if (!StringUtils.hasLength(usuario.getApellidos())) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            errors.rejectValue("apellidos", "required", "required");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Espero haber sido lo suficientemente claro en los comentarios java, si tienes dudas no dudes en comentar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La clase anterior será llamada cuando el usuario hace click en un enlace como:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;a href="${pageContext.request.contextPath}/forms/usuario.do"&gt;Registrar Usuario&amp;lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La clase será llamada porque el url(href) satisface el patrón declarado en la clase:&lt;/div&gt;&lt;div&gt;&lt;i&gt;@RequestMapping("/forms/usuario.do") &lt;span class="Apple-style-span" style="font-style: normal; "&gt;y el método a ejecutar será &lt;/span&gt;inicializarFormulario&lt;span class="Apple-style-span" style="font-style: normal; "&gt;, porque dicho método está anotado para que le lleguen todas las solicitudes GET &lt;i&gt;@RequestMapping(method = RequestMethod.GET) &lt;span class="Apple-style-span" style="font-style: normal; "&gt;debes de recordar que una de las formas de realizar solicitudes GET es mediante links(href) en las páginas html.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una vez ejecutado el método, este instanciarà un objeto usuario y lo devolverá en el modelo de datos a la siguiente vista:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;usuario.jsp&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;%@ page contentType="text/html" pageEncoding="UTF-8"%&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;"http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;html&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;head&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;title&gt;Registro de Usuarios&amp;lt;/title&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/head&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;body&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;form:form modelAttribute="usuario"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Codigo: &amp;lt;form:input path="codigo" /&gt;&amp;lt;form:errors path="codigo"/&gt;&amp;lt;br/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Nombres: &amp;lt;form:input path="nombres" /&gt;&amp;lt;form:errors path="nombres"/&gt;&amp;lt;br/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Apellidos: &amp;lt;form:input path="apellidos" /&gt;&amp;lt;form:errors path="apellidos"/&gt;&amp;lt;br/&gt;&amp;lt;br/&gt;&amp;lt;br/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;input type="submit" value="Registrar Usuario"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/form:form&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/body&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/html&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Podemos ver el código html generado y notar que el atributo method(del formulario) es POST, entonces cuando le demos al botón "Registrar Usuario" este procesamiento será enviado hacia el método &lt;i&gt;procesarFormulario &lt;/i&gt; de la clase &lt;i&gt;UsuarioController&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eso es todo por el momento, si tienes alguna duda puedes resolverla comentando...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-2775991369569978804?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/2775991369569978804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2009/08/spring-mvc-usando-controller-y.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/2775991369569978804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/2775991369569978804'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2009/08/spring-mvc-usando-controller-y.html' title='Spring MVC Usando @Controller y Formularios'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-122088992616594704</id><published>2009-08-18T21:47:00.000-07:00</published><updated>2009-08-20T22:08:21.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='spring basico'/><title type='text'>Spring MVC Usando Controllers con Anotaciones</title><content type='html'>Veamos como podemos implementar una pequeña aplicación en Spring que use SpringMVC con anotaciones de la manera más fácil posible.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aquí estan los componentes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Descriptor de despliegue(&lt;b&gt;web.xml&lt;/b&gt;):&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;web-app version="2.5"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;xmlns="http://java.sun.com/xml/ns/javaee"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;!-- &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    Declaración del servlet que Spring utilizará como Front Controller  &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    para nuestra aplicación.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    --&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;servlet&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;servlet-name&gt;frontController&amp;lt;/servlet-name&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;load-on-startup&gt;1&amp;lt;/load-on-startup&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/servlet&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;!-- Mapping del servlet anterior--&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;servlet-mapping&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;servlet-name&gt;frontController&amp;lt;/servlet-name&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;url-pattern&gt;*.do&amp;lt;/url-pattern&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/servlet-mapping&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;!--Tiempo en minutos que dura una session --&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;session-config&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;session-timeout&gt;30&amp;lt;/session-timeout&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/session-config&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;!--Listado de archivos de bienvenida --&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;welcome-file-list&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;welcome-file&gt;index.jsp&amp;lt;/welcome-file&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/welcome-file-list&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/web-app&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Front Controller de SpringMVC(&lt;b&gt;frontController-servlet.xml&lt;/b&gt;)&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;       xmlns:p="http://www.springframework.org/schema/p"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;       xmlns:context="http://www.springframework.org/schema/context"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;      &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;!--&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    La siguiente declaración buscará todos los estereotipos(Clases declaradas&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    con las anotaciones @Service,@Component,@Controller,@Repository)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    en el paquete pe.com.slcsccy.springmvc.controllers una vez identificado el&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    estereotipo entonces el contenedor instanciará el bean y por lo tanto estará&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    listo para ser utilizado por la aplicación&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    --&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;context:component-scan base-package="pe.com.slcsccy.springmvc.controllers"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;!--&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    El siguiente bean configura las propiedades prefijo(prefix) y sufijo(suffix)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    de Internalresourceviewresolver, el cual resuelve nombres de vistas lógicas&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    retornadas por los controladores(en el ejm:clases en el paquete controllers)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    Por ejemplo, un nombre de vista lógico podría ser "resultadoPlanillaQuinta"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    entonces esta vista será mapeada a "/WEB-INF/jsp/resultadoPlanillaQuinta.jsp"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;--&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;&amp;lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/beans&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;3. Un Controller de la aplicación(&lt;b&gt;PlanillaController.java&lt;/b&gt;) que mapeará las solicitudes a métodos en esta clase:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;package pe.com.slcsccy.springmvc.controllers;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.stereotype.Controller;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.ui.ModelMap;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.bind.annotation.RequestMapping;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import org.springframework.web.bind.annotation.RequestParam;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;@Controller&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public class PlanillaController {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /*&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; Si el método en el controller esta mapeado pero no retorna nada, entonces&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; Spring lo que hará es buscar una vista con el mismo nombre que el patron&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; del mapping pero sin la extensión, es decir buscara un archivo jsp con el&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; siguiente nombre: iniciarApp.jsp, este archivo debe de estar en /WEB-INF/jsp/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @RequestMapping("/iniciarApp.do")&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;public void iniciarAplicacion() {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        System.out.println("Inicio de la aplicación.");&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /*&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; El siguiente método acepta todas las solicitudes que vienen del patrón URL(en realidad es una ruta directa) /planilla/procesar.do,este patrón lo declaramos en la anotaciòn @RequestMapping, como salida tenemos un nombre de vista que va estar relacionado a un resolvedor de vistas, quién resolverá el recurso(archivo jsp) a presentar.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @RequestMapping("/planilla/procesarQuinta.do")&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;public String procesarQuinta(@RequestParam("periodo") String periodo, ModelMap modelo) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        modelo.addAttribute("periodo", periodo);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;i&gt;return "planilla/resultadoPlanillaQuinta";&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @RequestMapping("/planilla/procesarCuarta.do")&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;public String procesarCuarta(@RequestParam("periodo") String periodo, ModelMap modelo) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        modelo.addAttribute("periodo", periodo);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;  &lt;/i&gt;&lt;/span&gt;&lt;i&gt;return "planilla/resultadoPlanillaCuarta";&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    /*&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; Este método difiere con los 2 anteriores en el tipo de retorno, ahora el&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; tipo de retorno no es una cadena sino un ModelMap, este modelMap debe&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; contener el modelo de datos a ser presentado en la vista, en los métodos&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; anteriores colocabamos el modelMap como un argumento al método y después&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; usabamos ese modelMap para colocar atributos(modelo de datos) que iban&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; a ser pintados en la vista. En este método la vista es resuelta hacia el&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; mismo URL que lo solicitó, es decir la vista se resuelve hacia:&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; /WEB-INF/jsp/planilla/cierre.jsp, recordar que el prefijo: WEB-INF/jsp/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; y el sufijo son declarados en el frontController:&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; frontController-servlet.xml, ModelMap si revisas las fuentes de Spring extiende&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;LinkedHashMap que es una forma especializada de HashMap&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;     */&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    @RequestMapping("/planilla/cierre.do")&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;public ModelMap cerrarPlanilla(@RequestParam("periodo") String periodo) {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        /*Aquí consulta compleja a la base de datos para sacar los nombres*/&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        String[] nombres = {"Carlos","Alberto","Cacique","Yupanqui"};&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        return new ModelMap("nombres",nombres);&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;4. Ahora solo veamos los archivos jsp:&lt;/div&gt;&lt;div&gt;&lt;b&gt;4.1 cierre.jsp (/WEB-INF/jsp/planilla/cierre.jsp)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;"http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;html&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;head&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;title&gt;Cierre de Planilla&amp;lt;/title&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/head&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;body&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;br&gt;&amp;lt;br&gt;Planilla Cerrada&amp;lt;br&gt;&amp;lt;br&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;table&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            &amp;lt;c:forEach var="nombre" items="${nombres}" varStatus="status"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            &amp;lt;tr&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;                &amp;lt;td&gt;${status.index}&amp;lt;/td&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;                &amp;lt;td&gt;${nombres[status.index]}&amp;lt;/td&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;            &amp;lt;/tr&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;/c:forEach&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;        &amp;lt;/table&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    &amp;lt;/body&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;/html&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;4.2 resultadoPlanillaCuarta.jsp (/WEB-INF/jsp/planilla/resultadoPlanillaCuarta.jsp)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;div&gt;&lt;div&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;/div&gt;&lt;div&gt;   "http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;html&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;head&gt;&lt;/div&gt;&lt;div&gt;        &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;&lt;/div&gt;&lt;div&gt;        &amp;lt;title&gt;Resultado planilla Cuarta&amp;lt;/title&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;/head&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;body&gt;&lt;/div&gt;&lt;div&gt;        La planilla fue procesada para el periodo ${periodo}&lt;/div&gt;&lt;div&gt;    &amp;lt;/body&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/html&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal; font-weight: bold; "&gt;4.2 resultadoPlanillaQuinta.jsp (/WEB-INF/jsp/planilla/resultadoPlanillaQuinta.jsp)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; font-style: italic; "&gt;&lt;div&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;/div&gt;&lt;div&gt;   "http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;html&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;head&gt;&lt;/div&gt;&lt;div&gt;        &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;&lt;/div&gt;&lt;div&gt;        &amp;lt;title&gt;Resultado planilla Quinta&amp;lt;/title&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;/head&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;body&gt;&lt;/div&gt;&lt;div&gt;        La planilla fue procesada para el periodo ${periodo}&lt;/div&gt;&lt;div&gt;    &amp;lt;/body&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/html&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;El desarrollo de esta pequeña aplicación fué realizada con Spring 2.5.6, y el propósito es ver como podemos usar anotaciones en la capa de control de una aplicación MVC. Las anotaciones vistas fueron &lt;/span&gt;@Controller&lt;span class="Apple-style-span" style="font-style: normal;"&gt; y &lt;/span&gt;@RequestMapping.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Podemos ver como las solicitudes que enviamos a la aplicació se mapean correctamente probando de la siguiente manera, en el URL de tu navegador puedes poner:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;http://&amp;lt;server&gt;&lt;/span&gt;&lt;/a&gt;&lt;server&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;:&lt;/span&gt;&lt;/a&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;puerto&gt;&lt;/span&gt;&lt;/a&gt;&lt;server&gt;&lt;puerto&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/&lt;/span&gt;&lt;/a&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;app&gt;&lt;/span&gt;&lt;/a&gt;&lt;server&gt;&lt;puerto&gt;&lt;app&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;/planilla/cierre.do?periodo=200908&lt;/a&gt;&lt;/span&gt;&lt;/app&gt;&lt;/puerto&gt;&lt;/server&gt;&lt;/puerto&gt;&lt;/server&gt;&lt;/server&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:13px;"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:16px;"&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;http://&amp;lt;server&gt;&lt;/span&gt;&lt;/a&gt;&lt;server&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;:&lt;/span&gt;&lt;/a&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&amp;lt;puerto&gt;&lt;/span&gt;&lt;/a&gt;&lt;server&gt;&lt;puerto&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;/&lt;/span&gt;&lt;/a&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&amp;lt;app&gt;&lt;/span&gt;&lt;/a&gt;&lt;server&gt;&lt;puerto&gt;&lt;app&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;a href="http://localhost:8081/SpringMVC01/planilla/cierre.do?periodo=200908"&gt;/planilla/procesarQuinta.do?periodo=200908&lt;/a&gt;&lt;/span&gt;&lt;/app&gt;&lt;/puerto&gt;&lt;/server&gt;&lt;/puerto&gt;&lt;/server&gt;&lt;/server&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#551A8B;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"   style="font-size:100%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;y debería ejecutar el método adecuado sgún el mapping y redirigirse a la vista apropiada.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4533039919307135869-122088992616594704?l=carloscacique.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carloscacique.blogspot.com/feeds/122088992616594704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://carloscacique.blogspot.com/2009/08/spring-mvc-usando-controllers-con.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/122088992616594704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4533039919307135869/posts/default/122088992616594704'/><link rel='alternate' type='text/html' href='http://carloscacique.blogspot.com/2009/08/spring-mvc-usando-controllers-con.html' title='Spring MVC Usando Controllers con Anotaciones'/><author><name>Carlos cacique yupanqui</name><uri>https://profiles.google.com/109052698523618500658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-0DvMRrcDR0U/AAAAAAAAAAI/AAAAAAAAAK0/ELBTTxTuQjE/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4533039919307135869.post-6802951290812698238</id><published>2009-08-14T23:13:00.000-07:00</published><updated>2009-08-15T09:09:31.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inyeccion dependencias'/><category scheme='http://www.blogger.com/atom/ns#' term='spring basico'/><title type='text'>Spring Básico, inyección de dependencias desde xml</title><content type='html'>Este post tratará el concepto de inyección de dependencias declarado en un archivo xml,  y ¿cómo? desde código java podemos obtener el ensamblado(todos los beans instanciados y relacionados en memoria), para este caso utilizo un modelo de dominio de pedidos de compra, aquí hay que tener cuidado ya que el objetivo del post es ver como Spring inyecta las dependencias en los objetos que va creando, en un entorno de producción Spring no se utiliza para instanciar objetos de negocio o de un modelo de un dominio especifico(de esto se puede encargar Hibernate, Ibatis o el ORM de tu preferencia), Spring en entornos de producción nos servirá para instanciar servicios, daos, acciones de struts, etc...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Veamos la base de código, del modelo de dominio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Proveedor.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;package pe.com.slcsccy.springbasico.dominio;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public class Proveedor {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private Integer idProveedor;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String nombreProveedor;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String nombreContacto;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String direccion;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String telefono;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    //siguen setters y getters...&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;PedidoCompra.java&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt;package pe.com.slcsccy.springbasico.dominio;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import java.util.ArrayList;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public class PedidoCompra {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private Integer idPedidoCompra;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String numeroPedidoCompra;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String descripcionPedidoCompra;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String fechaPedido;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private String fechaEntrega;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    //Aqui agregamos referencias a un listado de items &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;//de pedido DetallePedido&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private ArrayList detalle;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    //Aqui mantenemos la información del proveedor &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;//a quien se realiza la compra&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private Proveedor proveedor;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    //siguen setters y getters...&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;DetallePedido.java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;package pe.com.slcsccy.springbasico.dominio;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;import java.math.BigDecimal;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;public class DetallePedido {&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private Integer idDetallePedido;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private Integer idPedidoCompra;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private Integer idProducto;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private BigDecimal precioUnitario;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    private Integer unidadesPedidas;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;    //siguen setters y getters...&lt;/i&gt;&lt;/div&gt;&lt;i&gt;}&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Ahora veamos el archivo de configuración de spring que hace que la magia de la instanciación y la inyección de componentes ó beans se lleve a cabo. El siguiente archivo lo colocamos en el directorio raiz de las clases java&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;pedido1.xml&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;!-- Definimos los namespaces que vamos a usar; recordar que un namespace define un enlace(Entre la instancia XML, este archivo, y el esquema con las reglas de formación que debe tener este archivo, el esquema está representado por una URL), el namespace en este archivo lo podemos identificar por la palabra clave &lt;b&gt;xmlns&lt;/b&gt;, si despues de esta palabra clave hay dos puntos y otra palabra, pues esta otra palabra es llamada el prefijo que deberemos usar en el archvo XML(este archivo), para este caso el namespace principal que usamos es&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;beans xmlns="http://www.springframework.org/schema/beans" y como no está asociado a un prefijo pues su uso en ste archivo es a través de la palabra "beans"(ojo podemos usar cualquier otra palabra, es como si declararamos una variable), resumiendo lo dicho entre instancias Xml y esquemas Xsd pues como una analogía podemos tomar un esquema como una clase y un instancia Xml como una instancia(objeto) de esa clase.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;--&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;/i&gt;&lt;/div&gt;&lt;div&
