web-dev-qa-db-ja.com

春にフィールドを自動配線できませんでした。どうして?

私はこのエラーを受け取り続け、その理由を理解することはできません。はい、多くの人々が同様の問題を抱えていることを知っています。

org.springframework.beans.factory.BeanCreationException: 'contactController'という名前のBeanの作成エラー:自動配線された依存関係の挿入に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCreationException:フィールドを自動配線できませんでした:private net.service.ContactService net.controller.ContactController.contactService;ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionException:依存関係のタイプ[net.service.ContactService]の一致するBeanが見つかりません。この依存関係の自動配線候補として適格な少なくとも1つのBeanが必要です。依存関係の注釈:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

ここにコントローラーがあります:

@Controller
@SessionAttributes
public class ContactController {

    @Autowired
    private ContactService contactService;
//methods...


}

ContactServiceImpl

@Service("contactService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class ContactServiceImpl implements ContactService {

    @Autowired
    private ContactDao contactDao;

    public ContactServiceImpl() {
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
    public void addContact(Contact contact) {
        contactDao.saveContact(contact);
    }

    @Override
    public List<Contact> getContacts() {
        return contactDao.getAllContacts();
    }

}

ContactDaoImpl

@Repository("contactDao")
public class ContactDaoImpl implements ContactDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void saveContact(Contact contact) {
        sessionFactory.getCurrentSession().saveOrUpdate(contact);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Contact> getAllContacts() {
        return (List<Contact>) sessionFactory.getCurrentSession().createQuery("from contact c").list();
    }

}

およびspring-servlet.xml

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

    <context:property-placeholder location="classpath:jdbc.properties" />
    <context:component-scan base-package="net.controller" />


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

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.user}" />
        <property name="password" value="${database.password}" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>net.form.Contact</value>
            </list>
        </property>


        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            </props>
        </property>
    </bean>

    <bean id="hibernateTransactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>
27
Sanyifejű

Spring servlet .xmlの場合:

<context:component-scan base-package="net.controller" />

(サービス実装がサービスインターフェース「net.service」と同じパッケージにあると仮定しました)

パッケージnet.service(またはnet全体)をコンポーネントスキャンに追加する必要があると思います。現在、springはnet.controllerでコンポーネントのみを検索し、サービス実装はnet.serviceにあるため、springによってインスタンス化されません。

34
Pyranja

私はこの同じエラーを受け取っていたので、それを探してここに行きました。私の修正は、抽象コンポーネントの実装に@Componentアノテーションを追加するだけのように見えました。

この場合、次のようになります。

import org.springframework.stereotype.Component;

...

@Component
public class ContactServiceImpl implements ContactService {
11
DKLEO

ContactServiceImpl Beanの作成に問題があります。最初に、Springコンテキストの開始時およびContactControllerのインスタンスの作成時に引数なしコンストラクターをデバッグすることにより、クラスが実際にインスタンス化されることを確認します。

ContactServiceImplが実際にSpringコンテキストによってインスタンス化されるが、それが@Autowire注釈と単に一致しない場合は、注釈注入でより明示的にしてください。あなたと同じような問題に対処し、いくつかの可能な解決策を提供している男は次のとおりです。

http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/

あなたが私に尋ねると、私はあなたが交換しても大丈夫だと思う

@Autowired
private ContactService contactService;

で:

@Resource
@Qualifier("contactService")
private ContactService contactService;
9
Shivan Dragon

このエラーが発生した場合、いくつかの注釈が欠落しています。サービスに@serviceアノテーションがありませんでした。その注釈を追加したとき、私にとってはうまく機能しました。

6
bond

今日も同じ問題に直面しました。サービス実装ファイルの@ Service/@ Componentアノテーションについて言及するのを忘れていたことが判明しました。これについては、Springはautowireできず、Beanの作成に失敗します。

1

私はまったく同じ問題を抱えていて、2つのクラスを同じパッケージに入れてpom.xmlに行を追加しようとしました

<dependency> 
            <groupId> org.springframework.boot </groupId> 
            <artifactId> spring-boot-starter-web </artifactId> 
            <version> 1.2.0.RELEASE </version> 
</dependency>
0
Cheps

Java config、この@Import(PersistenceJPAConfig.class)のようにRootConfigに設定をインポートしていることを確認してください

0
laudukang