使用crudRepositoy从DAO获取NullPointerException

时间:2012-06-26 10:11:20

标签: spring spring-data spring-data-jpa

我使用CrudRepository

获得了java.lang.NullPointerException

我的项目如下:

strut2行动

服务

存储库

class Action {
  @Autowired MyService service;
  public String execute(){
    service.getList();
    return "ok";
  }
}

interface Service {
   List getList();
}

@org.springframework.stereotype.Service
class ServiceImpl implements Service {
  @Autowired MyRepository repo;
  List getList(){
    return (List)repo.findAll();
  }
}
package com.mycompany.repositories;
interface MyRepository extends CrudRepository<MyPojo, String>{}

这是配置:

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

    <jpa:repositories base-package="com.mycompany.repositories" />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
        </property>
    </bean>
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="persistenceUnitName" value="unit-name" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
                <property name="database" value="POSTGRESQL"/>
            </bean>
        </property>
    </bean>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://127.0.0.1:5432/mydb" />
    </bean>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"></bean>  

    <tx:annotation-driven transaction-manager="transactionManager" />
</beans>

我是新手,每次调用Action类时,都会注入服务,但MyRepository总是为空。

如果你需要更多信息,请有人帮助我,请告诉我,谢谢!

编辑1

堆栈跟踪:

2012-06-26 15:33:32,041 INFO  - com.myproject.action.project.preparation.ApplicationAction - listing application...
java.lang.NullPointerException
    at com.myproject.service.impl.ApmProjectPreparationServiceImpl.getAllApplications(ProjectPreparationServiceImpl.java:41)
    at com.myproject.action.project.preparation.ApplicationAction.listAction(ApplicationAction.java:67)
    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:601)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)

我也尝试自己调试它。我在ServiceImpl类上发现 @Autowired MyRepository repo 为空。

1 个答案:

答案 0 :(得分:0)

似乎我找到了答案,感谢来自Spring Forum的@MartenDeinum。

这里有一些技巧:

  1. 我正在使用struts2作为GUI,所以我需要struts2 spring插件来重写struts2对象工厂,以便spring可以找到struts动作。

  2. 我为@Service

    添加了此配置
    <context:component-scan base-package="com.myproject" />
    

    基本上我也需要

    <jpa:repositories base-package="com.myproject.repository" />
    

    找到CrudRepository。

  3. 希望这可以帮助别人。