style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Spring inyeccion de dependencias+ usando la herencia java

Hola Comunidad:

Una consulta por ejemplo tengo esta herencia:

clase Persona{
....private nombre
 ....
//set y get
}

clase Usuario extends Persona{
  private pass
....//set y get
}

luego tengo sus respectivos daos e implementaciones con sus servicios respectivos . Todo aqui esta bien , el punto es que en cada servicio tengo

para servicioUsuario

@Autowired
private UsuarioDAO usuarioDao;
.......//todos los metodos crud

para servicioPersona
@Autowired
private PersonaDAO pesonaDao;
      //todos los metodos crud

luego en application context tengo

<bean id="beanPesona" class="com.backend.dominio.Persona">
</bean>

<bean id="beanUsuario" class="com.backend.dominio.Usuario">
</bean>

luego si ejecuto un test voe que me lanza un error del tipo Coul not autowire.. No unique ben of type .. singel matching bean but found entonces dice que encuentra dos tipos y solo debe encontrar uno

borre el bean usuario y funciono aqui amigos van la preguntas

¿ cuando se utiliza herencia en appliaction context
tengo que dejar el bean base , es decir en este caso beanPersona ????

la mayoria de los libros cuando se implementa el servicio de un dao colocan asi
//aqui el los autores dicen: inyectado por spring
private ClaseDAO nombreDao

¿es con el @autowired que sring inyecta?????

Por los avances totalmente agradecido

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

DAOs

Yo creo que el problema está en los DAOs; alguna vez me pasó esto, manejando DAOs de Hibernate. Supongo que UsuarioDAO y PersonaDAO son interfaces, no clases; y que tienes unas clases que implementan esos DAOs, pero en Spring defines los DAOs como unos proxies que van a envolver tus clases para agregarles el manejo de las sesiones (especialmente cerrarlas al final de los métodos o si ocurre una excepción). A esos proxies (creo que se llaman algo así como HibernateInterceptor) les indicas la interfaz que van a tener que implementar (PersonaDAO, UsuarioDAO). Pero por alguna razón cuando los defines así, Spring ya no los encuentra para hacer el Autowired, porque tiene al verdadero PersonaDAO (tu clase, que implementa la interfaz) y al proxy, que también implementa la interfaz en tiempo de ejecución.

De modo que no puedes usar Autowired para esos DAOs así solito, tienes que ponerles @Qualifier, o mejor aún usar la notación oficial de JEE y mejor le pones al setter @Resource(name="personaDao") por ejemplo.

Imagen de luxspes

Y el stacktrace?

Seria mas probable que recibieras ayuda precisa si en ves de escribir a mano un mensaje similar al que te aparecio: "Could Coul not autowire.. No unique ben bean of type .. singlesingel matching bean but found" hubieras copiado y pegado aqui el stacktrace completo. Le quitaste al error precisamente toda la informacion que podria usarse para ayudarte :'(

Imagen de ezamudio

RTFS

En este caso particular no hubiera sido tan útil el stacktrace en sí, pero sí el mensaje completo de la excepción.

El stack trace completo no sirve de mucho porque cuando mucho hará referencia a una línea de su código, donde crea el application context. Si es webapp entonces ni siquiera eso habrá. Pero el mensaje de Spring cuando no puede levantar el application context por alguna razón generalmente te indica el archivo de XML donde tuvo la bronca, la línea incluso, o el nombre del bean que estaba creando o configurando cuando ocurre la excepción.

Imagen de luxspes

RTFEM

Tienes razon... supongo que hace falta un blog post sobre RTFEM: RTF Exception Message... (Aunque a veces, con errores de inicialización de bean, si es mejor compartir el stacktrace completo, sobretodo cuando el fallo es por que el bean X al inyectarse al bean Y cuando este a su ves se injecta en el bean Z que a su ves se usa en el proceso Q)

Gracias a todos, pero bueno

Gracias a todos, pero bueno el doc de spring le agregado esto

@Autowired @Qualifier("beanPersona")

por cada bean, gracias de todas maneras, ademas estoy con ibatis , de antemano gracias

@aualifier esto no es lo mismo que @recurses o no????

para los daos tengo lo

para los daos tengo lo siguiente una interfazDAO del tipo parametrizada me explico:


package com.backend.persistencia.dao.iface;

import java.util.List;

import com.backend.persistencia.dao.excepcion.ExcepcionDao;

public interface IGenericoDAO {

/**
* Este funcion inserta un elemento
* en la base de datos
* @param item
* @return
* @throws ExcepcionDao
*/
int insert(T item) throws ExcepcionDao;

/**
* @param item
* @throws ExcepcionDao
*/
void update(T item) throws ExcepcionDao;

/**
* @param id
* @return
* @throws ExcepcionDao
*/
T findById(int id) throws ExcepcionDao;

/**
* @return
* @throws ExcepcionDao
*/
List findAll() throws ExcepcionDao;

/**
* @param item
* @throws ExcepcionDao
*/
void delete(T item) throws ExcepcionDao;

}

luego hago un dao pero ocupando su propia interfaz me explico asi

package com.backend.persistencia.dao.iface;

import com.backend.dominio.Persona;
public interface IPersonaDAO extends IGenericoDAO Persona {

}

luego tengo lo mismo para los servicios , lo hice asi porque si quiero añadir un funcion especifica ipersona la agrego solamente a ella  y no a todas las demas
ahora si quiero que todas tengan la funcion para todos tengo me voy añadir a la genral..bueno de todas maneras gracias comunidad en cuanto tenga dudas las tiro
gracias.

por si acaso en persona me

por si acaso en persona me falto colocar <>

Esto para todos para usar

Esto para todos para usar con ibatis con spring tienen que hacer lo siguiente:

1. Primero tienen que crear el mapeo de la tabla , por ejemplo usuario

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
        PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
        "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Usuario">

        <typeAlias type="com.backend.dominio.Usuario" alias="usuario" />  

        <resultMap id="resultUsuario" class="usuario">
                <result property="idUsuario" column="idUsuario" />
                <result property="pass" column="pass"/>
                <result property="user" column="user" />
    </resultMap>
       
        <insert id="insertUsuario" parameterClass="usuario">
                INSERT INTO  usuario(id,pass,user) VALUES (#idUsuario#,#pass#,#user#)
                <selectKey resultClass="int">
                        SELECT LAST_INSERT_ID()
           </selectKey>
        </insert>
       
        <select id="getUsuarios" resultMap="resultUsuario">
                SELECT  us.id as idUsuario,
                                us.pass,
                                us.user
                FROM usuario us
        </select>
       
        <update id="updateUsuario" parameterClass="usuario">
               
                UPDATE Usuario
                SET pass=#pass#,
                        user=#user#
                WHERE id=#idUsuario#
        </update>
       
        <select id="getUsuario" resultMap="resultUsuario" parameterClass="int">
                SELECT  us.id as idUsuario,
                                us.pass,
                                us.user
           FROM usuario us
           WHERE us.id=#value#
         </select>
</sqlMap>

Esto es un archivo xml por supuesto

2.Lluego tiene que configurarlo y decirle a spring donde esta lo hacemos asi

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
        <!-- SQLMAP PARA USUARIO -->
    <sqlMap resource="./com/backend/persistencia/sqlmap/Usuario.xml"/>
    <!--  -->
   
</sqlMapConfig>

3.-Bien una vez que nuestro amigo spring sabe donde estan nuestros mapeos , debemos ponerlo a trabajar
el dao

package com.backend.persistencia.dao;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.backend.dominio.Usuario;
import com.backend.persistencia.dao.excepcion.ExcepcionDao;
import com.backend.persistencia.dao.iface.IUsuarioDAO;

public class UsuarioDAO extends SqlMapClientDaoSupport implements IUsuarioDAO {

        SqlMapClientTemplate templateSpring = this.getSqlMapClientTemplate();
        public static Log logger = LogFactory.getFactory().getInstance(
                        UsuarioDAO.class);
       
        }
       
        public int insert(Usuario item) throws ExcepcionDao {
                // TODO Auto-generated method stub
                try {
                        templateSpring=this.getSqlMapClientTemplate();
                        Integer key=(Integer) templateSpring.insert("insertUsuario",item);
                        return key;
                } catch (Exception e) {
                        logger.error(e.getMessage());
                        e.printStackTrace();
                        throw new ExcepcionDao(e.getMessage());
                       
                }
        }
       
   //otros metodos crud.....
}

Lo amigable de esto y por eso que uso por primera vez spring (DIOS PORQUE NO LO OCUPE ANTES) que se olvidan de cerrar y abrir cuestiones como loco
simplemente llamana template , por supuesto el nombre insertUsuario debe ser el mismo que el xml cuando se mapea (ojo con eso).

bien nos queda la implementacion

5. Hacer el servicio

package com.backend.servicio;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.backend.servicio.iface.IServicioUsuario;

import com.backend.dominio.Usuario;
import com.backend.persistencia.dao.UsuarioDAO;
import com.backend.persistencia.dao.excepcion.ExcepcionDao;

public class ServicioUsuario implements IServicioUsuario {

       
        @Autowired
        private UsuarioDAO usuarioDAO;

        public List<Usuario> findAll() throws ExcepcionDao {
                // TODO Auto-generated method stub
                return usuarioDAO.findAll();
        }

        public Usuario findById(int id) throws ExcepcionDao {
                // TODO Auto-generated method stub
                return usuarioDAO.findById(id);
        }

        public int insert(Usuario item) throws ExcepcionDao {
                // TODO Auto-generated method stub
                return usuarioDAO.insert(item);
        }

        public void update(Usuario item) throws ExcepcionDao {
                // TODO Auto-generated method stub
         usuarioDAO.update(item);              
        }
       
       
}

fijense que con este servicio lo pueden ocupar con jsp,flex, extjs o lo que ustedes quieran, simplemente llamenlo(hola servicio estaas ahi....)

luego debemos configurarlo los xml de spring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
     <a href="
http://www.springframework.org/schema/beans" title="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a> <a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
" title="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
">http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
</a>     <a href="
http://www.springframework.org/schema/tx" title="http://www.springframework.org/schema/tx">http://www.springframework.org/schema/tx</a> <a href="http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
" title="http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
">http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
</a>     <a href="
http://www.springframework.org/schema/aop" title="http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop</a> <a href="http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

" title="http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

">http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

</a>    <bean
                class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <property name="location" value="classpath:database.properties" />
        </bean>

        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
                destroy-method="close">
                <property name="driverClassName" value="${database.class}" />
                <property name="url" value="${database.url}" />
                <property name="username" value="${database.username}" />
                <property name="password" value="${database.password}" />
        </bean>

        <bean id="transactionManager"
                class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="dataSource" />
        </bean>

        <tx:annotation-driven />

        <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
                <property name="dataSource">
                        <ref bean="dataSource" />
                </property>
                <property name="configLocation"
                        value="classpath:./com/backend/persistencia/sqlmap/config/sqlmap-config.xml" />
                <property name="useTransactionAwareDataSource" value="true" />
        </bean>

        <!-- DAO USUARIO -->
        <bean id="usuarioDAO" class="com.backend.persistencia.dao.UsuarioDAO">
                <property name="sqlMapClient">
                        <ref bean="sqlMapClient" />
                </property>
        </bean>

       
        <bean id="beanUsuario" class="com.backend.dominio.Usuario">
                <property name="user" value="nuevoUser" />
                <property name="pass" value="hola" />
        </bean>

       

        <!--
                BEANS DE SERVICIOS
        -->
        <bean id="servicioUsuario" class="com.backend.servicio.ServicioUsuario" />
       
</beans>

Nos queda configurar los xml si vamos a usar jsp o flex o bien otro como flex integration (que es lo que estoy haciendo) tambien podrian usar extjs en fin
muchas opciones bueno me fui en la dura y espero que una pequeña contribución a tan grande comunidad. nos vemos.

Imagen de Nopalin

tan simple como el mensaje de error

así es, el autowired es para autoinyectar dependencias basadas enn el tipo de la propiedad, si tienes dos propiedades que son del mismo tipo, pues spring va a fallar y no va a saber cual de los beans que se hayan declarado en el context va a utilizar. Para resolver este problema utilizas las anotacion @Resource, a la cual le pasas el id del bean como lo declaraste en tu context..

Estoy tratando de aprender

Estoy tratando de aprender programación orientada a objetos, pero no puedo hacerlo. ¿Cómo te las arreglas para aprenderlo? ¿Te gusta la programación tanto?
Giron Escobar - Dominios

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">