0

だから私はSpring JPAのテストでこの問題を抱えています。これが私のコードです:

ArticleService:

@Service("articleService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class ArticleServiceImpl implements ArticleService {


private ArticleDao articleDao;

  @Autowired
  public ArticleServiceImpl(ArticleDao articleDao) {
    this.articleDao = articleDao;
  }

  public ArticleServiceImpl() {
  }

  @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
  public void addArticle(Article article) {
    articleDao.saveArticle(article);
  }
}

私のArticleDao

@Repository("articleDao")
public class ArticleDaoImpl implements ArticleDao {

  private EntityManager em;

  @PersistenceContext
  public void setEntityManager(EntityManager em) {
    this.em = em;
  }

  // To Save the article detail
  public void saveArticle(Article article) {
    article.setAddedDate(new Date());
    em.persist(article);
  }
}

InputDatabaseServiceImpl問題は、クラスでこれらのメソッドを実行することにあります。

public class InputDatabaseServiceImpl implements InputDatabaseService {

public ArticleService articleService;


public InputDatabaseServiceImpl(ArticleService articleService){
    this.articleService= articleService;
}

public int inputArticle(Article article) {
    articleService.saveArticle(article);
    return 0;
}

アプリケーションappContext.xml

<context:property-placeholder location="/WEB-INF/database.properties" />

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

<!-- Declare a datasource that has pooling capabilities--> 
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="${database.driver}"
p:jdbcUrl="${database.url}"
p:user="${database.user}"
p:password="${database.password}"
p:acquireIncrement="5"
p:idleConnectionTestPeriod="60"
p:maxPoolSize="100"
p:maxStatements="50"
p:minPoolSize="10" />

<!-- Declare a JPA entityManagerFactory-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property>
<property name="persistenceUnitName" value="hibernatePersistenceUnit" />
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name="showSql" value="true"/>
</bean>
</property>
</bean>

<!-- Declare a transaction manager-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean> 
</beans>

inputArticleクラスに電話するたびendpointNullPointerExpcetion、列に並びましたarticleService.saveArticle(article);

私はそれが解決するのが最も簡単な例外であることを知っていましたが、私はしばらくの間これに苦労しており、助けが必要です..誰かが私に何が欠けているのかヒントを与えることができますか?

4

3 に答える 3

1

何が起こっているかというと、ArticleService 属性が初期化されていないということです。

これは、InputDatabaseServiceImpl Bean 構成の不一致、または依存関係を注入する注釈 (Bean が自動配線されている場合) が原因である可能性があります。

これを試して:

public class InputDatabaseServiceImpl implements InputDatabaseService {


   @Autowired
   public ArticleService articleService;

   public InputDatabaseServiceImpl(){
      //no need of arguments constructor
   }

   public int inputArticle(Article article) {
      articleService.saveArticle(article);
      return 0;
   }

}

Bean をオートワイヤーするには、この Bean が、ArticleServiceImpl クラスにはないパブリックのデフォルト コンストラクターを提示する必要があります。ArticleServiceImpl をリファクタリングする修正フォーム:

@Service("articleService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class ArticleServiceImpl implements ArticleService {

  @Autowired
  private ArticleDao articleDao;


  public ArticleServiceImpl() {
     //default constructor required for @Autowired
  }

  public ArticleServiceImpl() {
  }

  @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
  public void addArticle(Article article) {
    articleDao.saveArticle(article);
  }
}
于 2012-12-05T12:33:03.233 に答える
1

問題はそれarticleServiceがnullであり、初期化されていないことです

スプリングが InputDatabaseServiceImpl オブジェクトを管理している場合は、Auto WirearticleServiceを使用する必要があります@Autowired

それ以外の場合は、 ClassPathXMLApplicationContext.getBean を使用して articleService を初期化するために春にリクエストする必要があります

于 2012-12-05T12:34:26.227 に答える
0

他の回答が言ったように、articleService注入されていないため、あなたはnullです。appContext.xml に以下を含める必要があります。

<!-- Bean creation -->
<context:component-scan base-package="com.mypackage"/>
<!-- Also, you can create your beans one by one -->
<!-- <bean class="com.mypackage.MyBean" /> -->

<!-- Enables autowired annotations -->
<context:annotation-config/>
于 2012-12-10T09:07:13.380 に答える