【问题标题】:SPRING - @Autowired and @Service does not work弹簧 - @Autowired 和 @Service 不起作用
【发布时间】:2012-08-03 00:37:15
【问题描述】:

我知道存在很多这样的问题,我读了很多,没有人可以帮助我。谢谢你帮助我。

我不喜欢在 xml 中定义每个 bean 的 spring 方式,所以我在我的应用程序上下文中使用了一个扫描仪,但我认为只有 @Component(我的托管 bean),但它不想捕获 @Service 和 @Repository,我说因为我的服务是空的。

这就是 web.xml 中的 spring 内容

<!-- Archivo de configuraciones de Spring y JSF -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:WEB-INF/context/applicationContext*.xml</param-value>
    </context-param>

    <!-- Línea especial para la integración con un Java-based web framework (JSF) -->    
    <listener>
        <listener-lass>org.springframework.web.context.ContextLoaderListener    

那是我的 application-context.xml

 <context:spring-configured/>     

    <!-- Escanear todos los componentes y beans en vez de instanciar 1 por 1 -->
    <context:component-scan base-package="paquete" />

    <mvc:annotation-driven />

     <!-- Identificar todos los beans por las anotaciones -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- Archivo de propiedades configurables (database, messages, etc) -->
    <context:property-placeholder  location="classpath*:META-INF/*.properties"/>


    <!-- Gestor de transacciones de SPRING -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean class="org.springframework.orm.jpa.JpaTransactionManager"     id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <!-- El conversador entre nuestras entidades y las tablas de BD -->
    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="persistenceUnit" />
        <property name="persistenceXmlLocation" value="classpath:/WEB-INF/persistence.xml" />
        <property name="dataSource" ref="dataSource" />
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
        <property name="jpaVendorAdapter" ref="vendorAdapter" />
    </bean>

    <!-- Integración de Spring e Hibernate, no es obligatorio -->
    <bean id="vendorAdapter"
          class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="databasePlatform" value="${hibernate.dialect}" />
        <property name="showSql" value="${hibernate.show_sql}" />
        <property name="generateDdl" value="true" />
    </bean>

    <!-- Formalidad de dataSource de SPRING -->
    <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url}"/>
        <property name="username" value="${database.username}"/>
        <property name="password" value="${database.password}"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="true"/>
        <property name="testWhileIdle" value="true"/>
        <property name="timeBetweenEvictionRunsMillis" value="1800000"/>
        <property name="numTestsPerEvictionRun" value="3"/>
        <property name="minEvictableIdleTimeMillis" value="1800000"/>
    </bean>

在我的包“paquete”(西班牙语包,我来自秘鲁,对不起我的英语不好)我有 3 个子包,所以在 netbeans 中我看到 3 个包,如“paquete.beans”、“paquete.service”和“paquete” .repositorios”。我用“paquete”包中的组件扫描器调用

我正在使用 primefaces,所以你有一个 helloJSFBean 是..

 @ManagedBean
    @Scope("session")
    @Component
    public class helloPageJSFBean {

        private String nombre;
        private String nombre2;

        public String getNombre2() {
            return nombre2;
        }

        public void setNombre2(String nombre2) {
            this.nombre2 = nombre2;
        }

        @Autowired
        HelloService helloService;

        @PostConstruct
        public void init(){
            nombre="hi";
        }

        public void saludar(ActionEvent actionEvent){
            nombre2=helloService.saludar(nombre);
        }


        /* 
         *Getters and Setters
         */
        public String getNombre() {
            return nombre;
        }

        public void setNombre(String nombre) {
            this.nombre = nombre;
        }

    }

所以我打电话给我的 helloService 并且是...

  @Service
public class HelloServiceImpl implements HelloService{

    @Autowired
    protected HelloRepository helloRepository;

    @Override
    public String saludar(String nombre) {
        return helloRepository.saludar(nombre);
    }

}

我的仓库是

  @Repository
    public class HelloRepositoryImpl implements HelloRepository {

        @Override
        public String saludar(String nombre) {
            return "Hola "+nombre+", estás haciendo un excelente trabajo";
        }

    }

问题是我在我的“saludar”方法中得到NullPointerException,在调试中我的服务是空的并且不是helloServiceImpl的实例,所以我猜@Autowired它不起作用。

我收到的所有帮助都会很棒,我已经失去了 2 周的时间,什么也没有。谢谢大家。

【问题讨论】:

  • 服务是否位于 paquete 包下?比如...paquete.some.package.path.HelloServiceImpl ?
  • 您在哪个“saludar”中得到了异常?
  • 是的,“paquete”包是主包,里面有 3 个包,所以我有包:“paquete.beans”、“paquete.repository”和“paquete.service”。我的合作伙伴工作说没关系,应该阅读服务和存储库。当我调用 service.saludar(name) 时,我在 helloJSFBean 的“saludar”方法中得到了 nullPointer。谢谢

标签: java spring spring-mvc annotations


【解决方案1】:

好吧,我不知道为什么在文件位置的定义中使用类路径,所以,我想到了类路径,当有人输入“classpath *:directory/file.ext”时,会强制 IDE 在将java类放在上面时的SRC路径。并且显然那里没有文件夹(在我的配置项目中),因此您删除定义中的类路径并且它可以工作。

因此,如果这对任何我感到高兴的人有用的话。我要感谢你们所有人的时间和考虑回答。谢谢!!

这就是我的项目结构。我在用netbeans,这个页面说我不能发布图片,让你链接

http://img17.imageshack.us/img17/6338/sinttulofwk.png

还有我的配置文件...

Web.xml

 <!-- Archivo de configuraciones de Spring y JSF -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/context/applicationContext*.xml</param-value>
</context-param>

applicationContext.xml

...
...  
<!-- Archivo de propiedades configurables (database, messages, etc) -->
<context:property-placeholder  location="META-INF/database.properties"/>
...
...
 <!-- El conversador entre nuestras entidades y las tablas de BD -->
<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit" />
    <property name="persistenceXmlLocation" value="WEB-INF/persistence.xml" />
    <property name="dataSource" ref="dataSource" />
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
    <property name="jpaVendorAdapter" ref="vendorAdapter" />
</bean>

如果有人能告诉我类路径的想法是对还是错,我将不胜感激。问候

【讨论】:

    【解决方案2】:

    阅读this页面,需要设置:

       <!-- JSF and Spring are integrated -->
       <application>
         <el-resolver>
          org.springframework.web.jsf.el.SpringBeanFacesELResolver
         </el-resolver>
       </application>
    

    在您的 faces-config.xml 中,并使用 @ManagedProperty(value="#{name of your service}") 而不是 @Autowired 引用 Spring bean。

    【讨论】:

    • 我会尝试,在我用来指导我的示例项目中,他们不使用 ManagedProperty,只有服务和存储库注释,并且在组件扫描器中调用主包。谢谢你,我会尝试和评论
    • 对不起,那也不行。我做了你说的,我仍然有空指针。我在一个 bean、服务和存储库中放置了一个 postconstruct,并带有一个 println 打招呼,只有 bean 打招呼,服务和存储库没有初始化,谢谢 4 帮助
    • 但是其他bean(entityManagerFactory,transactionManager)正在初始化,对吧?
    • 我在日志中没有看到关于 entityManagerFactory、transactionManager 的任何信息。。在这一刻,我的项目中没有任何实体,我从服务和那些东西开始,当我从实体。我将对 bd 的引用设置为具有 2 个属性的单个表。我怎样才能保证这些 bean 的初始化?
    • 如果您的服务是由 Spring 实例化的,则将 transactionManager 或 entityManagerFactory 添加到您的服务(使用 setter 或自动装配),并检查它们是否不为空。您可以稍后删除它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2011-01-02
    相关资源
    最近更新 更多