spring autowire无效返回null

时间:2014-05-08 18:03:58

标签: java spring autowired

我现在正在学习春天。这是我的示例代码。我正在为我的REST服务使用jersey,spring,hibernate和mysql。

CustomerServiceImpl.java这是REST端点(部分代码)

package com.samples.service.impl;

@Path("customers")
public class CustomerServiceImpl implements CustomerService {

    private static Logger logger = Logger.getLogger(CustomerServiceImpl.class);

    @Autowired
    CustomerBO customerBO;

这里是CustomerBOImpl.java(部分代码)

package com.samples.BO.impl;

@Component
public class CustomerBOImpl implements CustomerBO {

    @Autowired
    CustomerDAO customerDAO;

    @Autowired
    CustomerAdapter customerAdapter;

CustomerDAOImpl.class     package com.samples.DAO.impl;

@Repository
public class CustomerDAOImpl implements CustomerDAO {

这是applicationContext.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:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
              http://www.springframework.org/schema/context 
              http://www.springframework.org/schema/context/spring-context-3.0.xsd
              http://www.springframework.org/schema/tx 
              http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

<context:property-placeholder location="classpath*:database.properties"/>
<context:component-scan base-package="com.samples"/>
<context:annotation-config />

</beans>    

这是我得到的前几行例外。

http-bio-8090-exec-1] [class: CustomerServiceImpl] INFO  - list all customers
[http-bio-8090-exec-1] [class: CustomerServiceImpl] INFO  - customerBO is null
May 08, 2014 10:55:29 AM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NullPointerException
    at com.samples.service.impl.CustomerServiceImpl.getAllCustomers(CustomerServiceImpl.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvo

这是web.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
    <display-name>Employee Service</display-name>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>

        classpath*:applicationContext.xml
        </param-value>
    </context-param>

    <context-param>
        <param-name>initializeContextOnStartup</param-name> 
        <param-value>true</param-value> 
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
            <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.samples.service</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>


</web-app>

所以,如果我理解这是如何正常工作的,我configuring xml通过提供我想要运行autoscan的软件包来自动扫描我的组件。以及我想要自动装配的对象。在CustomerServiceImpl类中,我使用@autowired作为customerBO对象,该对象本应由CustomerBOImpl.class定义上的@Component注释进行扫描。你可以帮忙解释为什么我的自动扫描没有拿起自动装配的customerBO对象吗? 感谢。

4 个答案:

答案 0 :(得分:4)

我怀疑问题是您的CustomerServiceImpl类是在Spring之外实例化的,可以是servlet容器,也可以显式在代码中。您需要让Spring实例化它(通过使其成为bean等)或使用<context:spring-configured/>。如果servlet容器实例化对象,我不确定后者是否会起作用,因为它可能取决于事件发生的顺序......

答案 1 :(得分:1)

Spring只知道autowire已标记为bean的字段。从你的代码CustomerDAO不是一个bean。例如,要在xml配置文件中将其定义为bean,您需要添加 <bean id="customerDao" class="com.packagesNames.CustomerDaoImpl"/> in the xml file.或者使用@Component注释类,或者在{{1}中使用@Bean定义它}。class。

答案 2 :(得分:1)

现在支持Jersey 2和Spring集成。

泽西岛文档:Chapter 22. Spring DI

博客:Implementing Jersey 2 Spring Integration

示例应用:Jersey's Hello World Spring WebApp

但是,在撰写本文时,不能使用Spring XML配置将Spring bean直接注入JAX-RS类。必须使用注释(@Autowired等)。

答案 3 :(得分:0)

我遇到了同样的问题。我在资源类中注入的bean总是以NULL的形式出现。

我花了两天的时间试图找出为什么我不能将Spring Bean注入JAX-RS资源类。然后我在Jersey documentation中找到了以下内容:

  

&#34;限制:

     

Spring bean不能通过使用直接注入JAX-RS类   Spring XML配置&#34;

注意:我在项目中使用了Jersey 2和Spring 3.x.