Problema de anotación @autowired, no inyectar bean en clase, usar Spring3.0, hibernar

la siguiente es mi clase:

package com.abc.trade.util;

public class StockTraderLogger {

    static Logger logger = Logger.getLogger("StockTraderLogger");

    @Autowired
    ConfigService configService; 




    public static void debug(Object className, Object logMessage) {     
        try {
            System.out.println("in debug.. ");
            StockTraderLogger stl =new StockTraderLogger();
            stl.addMessage(""+convertToString(className)+"\t"+convertToString(logMessage));
            System.out.println("in debug..post ");
        } catch (DataAccessException e) {
            System.out.println("Caught exception...");
                e.printStackTrace();
        }
    }

    public void addMessage(String message) throws DataAccessException {
        System.out.println("in  add message of util. ");
        System.out.println("String: " + configService); 

        configService.addMessage(message);          
    }
}

@Autowire la anotación no funciona. Está mostrando el valor de configService as nulo cuando se llama addMessage método. sin embargo, se inyecta correctamente en algunas de mis clases de Controlador, pero no aquí.

¿Alguien puede explicar cuál es el problema? y cómo resolver este problema?

El código para XML es: (beansdefinition.xml)

   <?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"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
           http://www.springframework.org/schema/aop


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

    <context:component-scan base-package="com.abc.trade.util"/> 
      <context:component-scan base-package="com.abc.trade.service"/>

       <!-- Hibernate Configuration -->
       <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    

                <property name="annotatedClasses">      
                    <list>
          <value>com.abc.trade.model.Order</value>  
          <value>com.abc.trade.model.Profile</value> 
          <value>com.abc.trade.model.Log</value>                
                    </list>    
                </property>  
           </bean>

            <tx:annotation-driven/> 

           <bean id="transactionManager" 
               class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory" ref="sessionFactory"/>
          </bean>

           <bean id="commonService" class="com.abc.trade.framework.service.CommonServiceImplementor">
                <property name="commonDao" ref="commonDao"/>
           </bean>

           <bean id="commonDao" class="com.abc.trade.framework.dao.HibernateDAO">
            <property name="sessionFactory"><ref local="sessionFactory"/></property>

           </bean>

            <bean id="configService" class="com.abc.trade.service.ConfigServiceImplementor" parent="commonService">
           </bean>

           <import resource="../context/springws-servlet.xml"/>
     </beans>

Otro XML es: (Springmvc-servlet.xml)

<?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:webflow="http://www.springframework.org/schema/webflow-config"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/webflow-config
        http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">

   <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
        <property name="prefix" value="/jsp/"/>
         <property name="suffix" value=".jsp"/>
    </bean>


     <context:component-scan base-package="com.abc.trade.controller" />   
     <context:component-scan base-package="com.abc.trade.util"/>


     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages" />
    </bean>

     <!-- Exception Resolver -->
     <bean id="exceptionResolver"
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="com.abc.trade.framework.exception.DataAccessException">
                errorPage</prop>
                <prop key="java.sql.SQLException">errorPage</prop>
                <prop key="java.lang.Exception">errorPage</prop> 
            </props>
        </property>
    </bean>   

</beans>

Gracias de antemano.

ConfigService:

package com.abc.trade.service;
import org.springframework.stereotype.Service;
import com.abc.trade.framework.exception.DataAccessException;

public interface ConfigService {

        public void addMessage(String message) throws DataAccessException;
}

Implementador del servicio de configuración:

package com.abc.trade.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.abc.trade.framework.exception.DataAccessException;
import com.abc.trade.framework.service.CommonServiceImplementor;
import com.abc.trade.model.Log;
import com.abc.trade.model.Mode;
import com.abc.trade.util.StockTraderLogger;

@Service("configService")
public class ConfigServiceImplementor extends CommonServiceImplementor implements ConfigService{

    String errorMessage = "";

    @Override
    public void addMessage(String message) {
        System.out.println("in add message of service...........");
        Log log = new Log();
        try{
            log.setMessage(message);
            System.out.println("Message is: "+message);
            int i=save(log);
        }catch(Exception e)
        {
            errorMessage = "Error in saving debug message";
            e.printStackTrace();
            //throw new DataAccessException(errorMessage);
        }

    }

}

preguntado el 10 de mayo de 11 a las 13:05

¿Cuál es el nombre de clase de paquete completo de la clase ConfigService? Creo que la inyección predeterminada es por tipo, no por nombre. -

Conecté automáticamente este bean en el controlador y funciona bien, pero si conecté automáticamente en algunas otras clases, entonces no se conectará automáticamente. -

¿¿¿Por casualidad resolviste el problema sagar ???? -

@indyaah: No, actualmente no estoy trabajando en Spring. -

4 Respuestas

StockTraderLogger no se declara como frijol de primavera y no existe en el contexto de primavera y por esa razón la inyección no funcionará.

<bean id="StockTraderLogger" class="com.abc.trade.util.StockTraderLogger"/>

or

@Component
public class StockTraderLogger { /**/ }

contestado el 10 de mayo de 11 a las 18:05

Aquí el problema está en el método de depuración:

    StockTraderLogger stl =new StockTraderLogger();

Esto no se gestiona por primavera. Puede inyectar un bean administrado por Spring en uno no administrado de dos maneras. Aquí puede inyectar configService en StockTraderLogger como:

1) Por AutowireCapableBeanFactory:

    ApplicationContext ctx = new ClassPathXmlApplicationContext("beansdefinition.xml");
    StockTraderLogger stl = new StockTraderLogger();
    ctx.getAutowireCapableBeanFactory().autowireBeanProperties(stl, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);

2) Mediante el uso de la anotación Spring AOP @Configurable que marca una clase como elegible para la configuración impulsada por Spring (como los objetos instanciados con el operador 'nuevo').

    @Configurable
    public class StockTraderLogger {
    ...
    }

and specifying this <context:spring-configured/> in beansdefinition.xml. 

Puedes encontrar más información sobre esta primavera aop manera aquí.

Respondido 18 Abr '14, 23:04

Agregue esto a applicationContext.xml:

xmlns:mvc="http://www.springframework.org/schema/mvc"

y

http://www.springframework.org/schema/mvc a xsi:schemalocation

Se requiere mvc-annotation conducido para controladores anotados y otras características:

<mvc:annotation-driven />

contestado el 17 de mayo de 13 a las 19:05

También probé esto en mi aplicación, no funciona, eso es un problema grave. Vamos a cerrarlo como sea posible. - Akash5288

Creo que te estas perdiendo

<context:annotation-config />

También asegúrese de que su clase ConfigService tenga

@Service("configService") 

Anotación, hará que esta clase sea candidata para cableado automático.

y por qué deberías usar

<context:component-scan base-package="package" />

para el nombre del paquete ConfigService.

contestado el 10 de mayo de 11 a las 18:05

El escaneo de componentes está allí en mi XML, puede verlo en el código XML que compartí en cuestión. ¿Necesito cambiarlo? - Sagar

necesita cambiar o agregar uno nuevo que se refiere al paquete configService - danny.lesnik

puede verificar beansdefinition.xml, en eso agregué un escaneo de componentes que se refiere al paquete de servicio. Pero el mismo resultado. - Sagar

¿Podría publicar el código ConfigService y su código de interfaz? - danny.lesnik

¿Alguien tiene una solución adecuada para ello? También lo intenté pero no funcionó. Cerrámoslo lo más posible .. - Akash5288

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.