2

バグが見つからない場合は、少なくとも「はい」または「いいえ」と言って、すべての正しい手順を実行したことを確認してください。そうすれば、少なくともコンテキスト xml ファイルに別のエラーがあると考えることができます

エラーは次のとおりです

原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 依存関係のタイプ [net.com.htts.transaction.service.mapping.FundService] の一致する Bean が見つかりません: この依存関係のオートワイヤー候補として適格な少なくとも 1 つの Bean が必要です. 依存関係アノテーション: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

リポジトリ Bean をロードできない Junit テストがあります。

1) インターフェイス FundRepository view plaincopy to clipboardprint? を作成しました。注: コード ブロック内のテキスト コンテンツは、パッケージ net.com.htts.transaction.data.repository によって自動的にワードラップされます。

import org.springframework.stereotype.Repository;   
import net.com.htts.transaction.data.entity.Fund;   

@Repository  
public interface FundRepository {    
public void createFund(Fund fund);   
}  

package net.com.htts.transaction.data.repository;

import org.springframework.stereotype.Repository;
import net.com.htts.transaction.data.entity.Fund;

@Repository
public interface FundRepository { 
public void createFund(Fund fund);
} 

インターフェイスには @Repository があります

2) インターフェイスを実装する FundRepositoryImpl を作成しました

プレーンコピーをクリップボードプリントに表示しますか? 注: コード ブロック内のテキスト コンテンツは、パッケージ net.com.htts.transaction.data.repository によって自動的にワードラップされます。

import java.util.List;   

import net.com.htts.transaction.data.entity.Fund;   

import javax.persistence.EntityManager;   
import javax.persistence.PersistenceContext;   
import javax.persistence.PersistenceContextType;   

public class FundRepositoryImpl implements FundRepository{   

@PersistenceContext(type = PersistenceContextType.EXTENDED)   
private EntityManager entityManager;   

public void createFund(Fund fund) {   
    entityManager.persist(fund);   
}   
     }  
    package net.com.htts.transaction.data.repository;
import java.util.List;

import net.com.htts.transaction.data.entity.Fund;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;

public class FundRepositoryImpl implements FundRepository{

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;

public void createFund(Fund fund) {
    entityManager.persist(fund);
}
}

春のデータコンテキストを作成しました

この文脈で私は以下を追加しました

プレーンコピーをクリップボードプリントに表示しますか? 注: コード ブロック内のテキスト コンテンツは、自動的にワードラップされます。

           <!-- Scan the repositories -->   
<jpa:repositories base-package="net.com.htts.transaction.data.repository" />  
           <!-- Scan the data layer -->
<context:component-scan base-package="net.com.htts.transaction.data" />

           <!-- Scan the repositories -->
<jpa:repositories base-package="net.com.htts.transaction.data.repository" />

私が読んだすべてによると、FundRepository で @Autowired を実行するには、これで十分なはずです。

Junit は次のとおりです。

@RunWith(SpringJUnit4ClassRunner.class)   
@ContextConfiguration("classpath:/spring/fund-test-data.xml")   
public class FundRepositoryTest {   

@Autowired    
 private FundRepository repository;   



@Test  
public void createFund(){   
}   

}

文脈は以下の通り

<bean id="entityManagerFactory" 
 class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">   
    <property name="dataSource" ref="dataSource" />   
    <property name="packagesToScan">   
        <list>   
            <value>net.com.htts.transaction.data</value>   
            <value>net.com.htts.transaction.data.repository</value>   
        </list>   
    </property>   
     <property name="jpaVendorAdapter">   
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">   
            <property name="showSql" value="true" />   
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLInnoDBDialect" />   
            <property name="generateDdl" value="true" />   
        </bean>   
    </property>   
    <property name="jpaProperties">   
        <props>   
            <prop key="hibernate.hbm2ddl.auto">validate</prop>   
            <prop key="hibernate.ejb.naming_strategy">
        net.com.htts.transaction.data.naming.NamingStrategy</prop>   
        </props>   
    </property>   
</bean>   

<bean id="dataSource"  
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />   
    <property name="url" value="jdbc:mysql://localhost/funds" />   
    <property name="username" value="fund_user" />   
    <property name="password" value="fund_user" />   
</bean>   

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">   
    <property name="entityManagerFactory" ref="entityManagerFactory" />   
</bean>   

<!-- Scan the data layer -->   
<context:component-scan base-package="net.com.htts.transaction.data" />   

<!-- Scan the repositories -->   
<jpa:repositories base-package="net.com.htts.transaction.data.repository" />   

</beans>   
4

3 に答える 3

3

私の知る限り、@Repositoryアノテーションはインターフェースではなく具体的​​な実装に存在する必要があります。FundRepositoryImplコンポーネントの注釈が付けられていないため、Spring は を見つけてインスタンス化することはありません。一般に、Java のアノテーションは継承されません。一部のフレームワークでは、他の方法でアノテーションを継承できます。この質問も参照してください。

于 2013-10-10T15:18:54.073 に答える
0

アノテーションは継承されないため、インターフェースを実装したクラスでアノテーションを使用する必要があります。実装する必要がある場合は、@Qualifireを使用する必要があります

于 2013-11-05T08:07:14.927 に答える
0

1) ログ スニペットからNo matching bean of type [net.com.htts.transaction.service.mapping.FundService]、提示されたソースのどこにも見られなかったプロジェクトのどこかに FundService の定義に問題があることが示されています。

本当にレポに問題があることを再確認し、適切なログを添付するか、そのサービスを調べてください

2) コードを簡素化し、データ アクセス レイヤーを再度書き直さないようにしたい場合は、Spring データ リポジトリを利用できます。

于 2013-11-05T08:21:17.790 に答える