Spring:context-component-scan不起作用

时间:2014-04-29 15:00:43

标签: spring spring-data autowired

围绕这个问题有很多问题,但我仍然没有找到阻止我的bean自动装配的根本原因。 我有以下级别的包:

com.pack.amg.service  
com.pack.amg.repository
com.pack.amg.beans  
com.pack.amg.resources  

applicationContext.xml (这是web.xml中 ContextLoaderListner 所必需的)

<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:neo4j="http://www.springframework.org/schema/data/neo4j"
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.2.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-3.2.xsd
                    http://www.springframework.org/schema/data/neo4j
                    http://www.springframework.org/schema/data/neo4j/spring-neo4j-3.0.xsd
                    http://www.springframework.org/schema/tx
                    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">


<context:component-scan base-package="com.pack.amg" />

<bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
    <constructor-arg value="http://localhost:7474/db/data/" index="0" />
</bean>
<neo4j:config graphDatabaseService="graphDatabaseService"
    base-package="com.pack.amg.repository" />
<neo4j:repositories base-package="com.pack.amg.repository" />
<tx:annotation-driven mode="proxy" />

我期待在这里使用<context:component-scan base-package="com.pack.amg" />自动扫描我的所有包和子包及其类,这可能是真的但根本不起作用..!以下是我的REST资源:
TestResource.java

@Path("/")
@Service
public class TestResource 
{   
    @Autowired
    private MyService myService;  
    @Path("/save")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response getResponse(ParamBeans bean)
    {
       System.out.println(bean);
       String str = myService.save(bean); // <-- here myService is evaluating as null !!
       return Response.ok(str).build();
    }  
}  

MyService.java

@Service
public class MyService
{
    @Autowired
    private MyRepository repository;

    public String save(ParamBeans bean)
    {
        return "Saved";
    }
}  

我的战争是在没有任何异常的情况下正确部署,但在调用我的REST服务时,它将MyService评估为null。有谁知道为什么?感谢

1 个答案:

答案 0 :(得分:2)

M.Deinum是对的。你必须让你的春天知道你的运动衫。我以前遇到过同样的问题,您需要在pom.xml中添加其他依赖项和配置,如下所示:

<dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-spring</artifactId>
        <version>1.18.1</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </exclusion>
        </exclusions>
    </dependency>  

并从web.xml替换旧的Jersey servlet实现,其中包括以下内容:

<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.your.package.resources</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>  
<servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern> <!-- depending upon your choice -->
</servlet-mapping>  

com.sun.jersey.spi.spring.container.servlet.SpringServlet属于最新的依赖性,即jersey-spring。希望这有帮助

更新

正如cronemberger所建议的那样,Jersey 2 lib似乎存在一些问题。因此,上面的实现可能不适用于Jersey 2,但我需要检查相同的内容。