在 MongoTemplate 上获取 NullPointerException

Getting NullPointerException on MongoTemplate

我正在使用 Spring + jersey + mongodb(在 mongolab 上)+ maven

Web 服务部分工作正常,但是当我尝试连接到数据库时,我在 MongoTemplate 上遇到空指针异常我已经尝试了很多解决方案,但 none 工作正常

这是我的代码:

应用程序上下文:

<?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:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mongo="http://www.springframework.org/schema/data/mongo"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/data/mongo
    http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd">


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

    <!-- Factory bean that creates the Mongo instance -->
    <mongo:mongo host="ds031972.mongolab.com" port="31972" id="mongo" />
    <mongo:db-factory dbname="proyecto_desarrollo" username="danprat" password="19693058" mongo-ref="mongo" id="mongoDbFactory" />

    <!-- MongoTemplate for connecting and quering the documents in the database -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    </bean>
</beans>

这里是使用 mongoTemplate

的 dao
public class UserManager {

    public static final String COLLECTION_NAME = "user";

    @Autowired
    private MongoTemplate mongoTemplate;

    public List<User> getUsers() {
        return mongoTemplate.findAll(User.class , COLLECTION_NAME);
    }
}

以防万一这是服务文件

@Path("/users")
public class UserService {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<User> getUsers(){

        UserManager userManager = new UserManager();

        return userManager.getUsers();
    }
}

mongolab 提供的连接 uri:

mongodb://<dbuser>:<dbpassword>@ds031972.mongolab.com:31972/proyecto_desarrollo

我相信 MongoTemplate 没有正确注入,但不知道为什么我是 spring 和 mongo

的新手

编辑

由于给出的答案,这是一个有效的方法:

@Component
public class UserManager {

    public static final String COLLECTION_NAME = "user";

    @Autowired
    private MongoTemplate mongoTemplate;

    public List<User> getUsers() {
        return mongoTemplate.findAll(User.class , COLLECTION_NAME);
    }
}


@Path("/users")
@Component
public class UserService {

    @Autowired
    UserManager userManager;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<User> getUsers(){


        return userManager.getUsers();
    }
}

xml:

<context:component-scan base-package="com.jersey.persistence" />
<context:component-scan base-package="com.jersey.services" />
<context:component-scan base-package="com.jersey.commons.entities" />
<!-- Factory bean that creates the Mongo instance -->
<mongo:mongo host="ds031972.mongolab.com" port="31972" id="mongo" />
<mongo:db-factory dbname="proyecto_desarrollo" username="danprat" password="19693058" mongo-ref="mongo" id="mongoDbFactory" />

<!-- MongoTemplate for connecting and quering the documents in the database -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>

我认为您没有像 UserManager 那样设置应用程序上下文来正确扫描 类。 UserManager 似乎没有使用必需的 @Component 注释进行注释。

另外,您可能没有扫描自己的包来进行注入。我明白了

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

您需要添加 UserManager 所在的包,以及您需要扫描的任何其他内容。您可以通过附加以逗号分隔的附加碱基 类 来实现。