2

我使用 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 存储库为空。

4

1 回答 1

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。

希望这可以帮助别人。

于 2012-06-27T14:15:03.200 回答